xsl:template

Transkrypt

xsl:template
XML – eXtensible Markup Language 3
XSL transformations (XSLT)
XSLT (ang. eXtensible Stylesheet Language Transformations) jest opartym
na XML językiem transformacji dokumentów XML
XSLT umożliwia przetłumaczenie dokumentów z jednego formatu XML na
inny format XML, ale również na HTML, PDF i inne.
Arkusze XSLT określają w
jaki sposób przekształcić poszczególne
elementy wejściowe pliku XML.
dokument XML
procesor XSLT
arkusz XSLT
plik wyjściowy
(XML, HTML,
PDF etc.)
XSLT i przeglądarki
Struktura XSLT
Arkusz XSLT ma następującą strukturę
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
INSTRUKCJE OKREŚLAJĄCE PRZEKSZTAŁCENIA ELEMENTÓW
</xsl:stylesheet>
Zapisujemy go w pliku z rozszerzeniem xsl np. people.xsl.
W dokumencie XML, który ma być przekształcamy umieszczamy
<?xml-stylesheet type="application/xml" href="people.xsl"?>
Dołączenie XSLT
Rozważmy następujący dokument XML
<?xml version="1.0"?>
<?xml-stylesheet type="application/xml" href="people.xsl"?>
<people>
<person born="1912" died="1954">
<name>
<first_name>Alan</first_name>
<last_name>Turing</last_name>
</name>
<profession>computer scientist</profession>
<profession>mathematician</profession>
<profession>cryptographer</profession>
</person>
<person born="1918" died="1988">
<name>
<first_name>Richard</first_name>
<last_name>Feynman</last_name>
</name>
<profession>physicist</profession>
</person>
</people>
xsl:template
Przykład 1
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
</xsl:stylesheet>
Wynik:
AlanTuringcomputer scientistmathematiciancryptographerRichardFeynmanphysicist
Jeżeli chcemy dokonać transformacji wybranego elementu z dokumentu
XML musimy się do niego odwołać w arkuszu XSL:
<xsl:template match="element">
…
</xsl:template>
xsl:template
Przykład 2
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">A Person</xsl:template>
</xsl:stylesheet>
Wynik:
A PersonA Person
W dokumencie wejściowym są dwa elementy person.
Procesor napotykając te elementy zamienia je na A Person.
xsl:template
Przykład 3
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person"><p>A Person</p></xsl:template>
</xsl:stylesheet>
Wynik
A Person
A Person
W dokumencie wejściowym są dwa elementy person.
Procesor napotykając te elementy zamienia je na A Person umieszczone
w oddzielnych akapitach.
XSLT
Arkusz XSLT musi być (jako dokument XML) poprawny składniowo (ang. well
formed).
Musi zatem spełniać wszystkie wymagania związane z poprawnością
składniową.
Przykład 4
Poniższy arkusz XML nie jest poprawny składniowo.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person"><p>A Person</xsl:template>
</xsl:stylesheet>
xsl:value-of
Jeżeli chcemy wybrać z wejściowego dokumentu XML pewien element w
arkuszu XSLT stosujemy element:
<xsl:value-of select="element"/>
Przykład 5
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">
<xsl:value-of select="name"/>
</xsl:template>
</xsl:stylesheet>
xsl:apply-templates
Wynik
Alan Turing
Richard Feynman
Procesor napotykając elementy person pobiera z nich wartości
elementów name i umieszcza w oddzielnych akapitach.
Procesor XSLT przechodzi przez elementy dokumentu XML metodą
PREORDER.
Atrybutem match
dokumentu XML.
elementu template są węzły przetwarzanego
Z wyselekcjonowanych w ten sposób węzłów już można pobrać (i wstawić
do wyniku) dane, można je także skierować do dalszego przetwarzania,
poprzez umieszczenie dyrektywy xsl:apply-templates.
xsl:value-of
Przykład 6
W poniższym przykładzie wybieramy wartości elementów last_name i
first_name będących dziećmi elementu name.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="name">
<xsl:value-of select="last_name"/>
<xsl:value-of select="first_name"/>
</xsl:template>
</xsl:stylesheet>
Zauważmy, że procesor najpierw przetwarza nazwisko a później imię.
xsl:value-of
Wynik:
TuringAlancomputer scientistmathematiciancryptographer FeynmanRichardphysicist
Modyfikacja:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="name">
</xsl:template>
</xsl:stylesheet>
xsl:value-of
Wynik:
computer scientist mathematician cryptographer physicist
Jeżeli chcemy aby w dokumencie wynikowym były tylko wartości
elementów last_name i first_name musimy wyraźnie to zapisać…
…tzn. musimy zapisać, że procesor ma przetwarzać element name.
xsl:apply-templates
Przykład 7
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="name">
<xsl:value-of select="last_name"/>
<xsl:value-of select="first_name"/>
</xsl:template>
<xsl:template match="person">
<xsl:apply-templates select="name"/>
</xsl:template>
</xsl:stylesheet>
W tym miejscu rozpoczyna się przetwarzanie elementu name.
Procesor zaczyna szukać elementu template z wartością match="name".
XSLT
Wynik:
TuringAlan FeynmanRichard
Kolejność elementów w arkuszu XSLT nie ma znaczenia.
Ważna jest tylko kolejność elementów w dokumencie XML.
Załóżmy teraz, że chcemy zawartość elementu people umieścić w
dokumencie HTML o tytule Famous Scientists.
Musimy zatem w odpowiednim miejscu umieścić instrukcję przetwarzania
dzieci korzenia (people)
XSLT
Rozważamy następujący dokument XML:
<?xml version="1.0"?>
<?xml-stylesheet type="application/xml" href="people.xsl"?>
<people>
<person born="1912" died="1954">
<name>
<first_name>Alan</first_name>
<last_name>Turing</last_name>
</name>
<profession>computer scientist</profession>
<profession>mathematician</profession>
<profession>cryptographer</profession>
</person>
<person born="1918" died="1988">
<name>
<first_name>Richard</first_name>
<last_name>Feynman</last_name>
</name>
<profession>physicist</profession>
</person>
</people>
XSLT
Przykład 8
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="people">
<html>
<head>
<title>Famous Scientists</title>
</head>
<body>
<xsl:apply-templates select="person"/>
</body>
</html>
</xsl:template>
XSLT
Przykład 8 cd
<xsl:template match="name">
<p>
<xsl:value-of select="last_name"/>
<xsl:value-of select="first_name"/>
</p>
</xsl:template>
<xsl:template match="person">
<xsl:apply-templates select="name"/>
</xsl:template>
</xsl:stylesheet>
XSLT - atrybuty
W arkuszach XSLT możemy transformować nie tylko wartości elementów.
Możliwe jest także odwoływanie się do atrybutów.
Wykorzystujemy w tym celu element:
<xsl:template match="@nazwa_atrybutu">
…
</xsl:template>
Jeżeli chcemy odwołać się do wszystkich atrybutów jako nazwe_atrybutu
podajemy *:
<xsl:template match="@*">
…
</xsl:template>
XSLT - atrybuty
Przykład 9
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">
<p>
<xsl:apply-templates select="name"/>
<br/>Born: <xsl:apply-templates select="@born"/>
</p>
</xsl:template>
</xsl:stylesheet>
Element
<xsl:apply-templates select="@born"/>
„zwraca” wartość atrybutu born.
XSLT
Wynik:
AlanTuring
Born: 1912
RichardFeynman
Born: 1918
Jeżeli chcemy odwołać się do dowolnego elementu w dokumencie XML w
arkuszu XSLT stosujemy element
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
* - dowolny element, / - korzeń, | - alternatywa.
Powyższy element spowoduje, że procesor dotrze do wszystkich elementów
i korzenia z wyjątkiem atrybutów i elementów z przestrzeni nazw które nie
są dziećmi swoich rodziców.
XSLT – przestrzenie nazw
Dodajmy do rozważanego przykładu przestrzeń nazw:
<?xml version="1.0"?>
<?xml-stylesheet type="application/xml" href="people.xsl"?>
<people xmlns="http://www.cafeconleche.org/namespaces/people">
<person born="1912" died="1954">
<name>
<first_name>Alan</first_name>
<last_name>Turing</last_name>
</name>
<profession>computer scientist</profession>
<profession>mathematician</profession>
<profession>cryptographer</profession>
</person>
<person born="1918" died="1988">
<name>
<first_name>Richard</first_name>
<last_name>Feynman</last_name>
</name>
<profession>physicist</profession>
</person>
</people>
XSLT – przestrzenie nazw
Rozważane wcześniej arkusze XSLT nie mają zastosowania do tak
zmodyfikowanego dokumentu XML.
Informację o przestrzeni nazw musimy dodać do arkusza XSLT.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:pe="http://www.cafeconleche.org/namespaces/people">
...
</xsl:stylesheet>
Ponadto do elementów w dokumencie XML pochodzących z tej
przestrzeni nazw musimy odwoływać się za pomocą zdefiniowanych
prefixów.
XSLT – przestrzenie nazw
Przykład 10
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:pe="http://www.cafeconleche.org/namespaces/people">
<xsl:template match="pe:people">
<html>
<head>
<title>Famous Scientists</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="pe:name">
<p>
<xsl:value-of select="pe:last_name"/>
<xsl:value-of select="pe:first_name"/>
</p>
</xsl:template>
<xsl:template match="pe:person">
<xsl:apply-templates select="pe:name"/>
</xsl:template>
</xsl:stylesheet>
xsl:for-each
Arkusze XSLT umożliwiają iteracyjne przeglądanie elementów dokumentu
XML
Wykorzystujemy w tym celu element:
<xsl:for-each select="nazwa_elementu">
…
</xsl:for-each>
Przykład 11
<xsl:template match="people">
<xsl:for-each select="person">
<xsl:value-of select="name"/>
<xsl:value-of select="@born"/>
</xsl:for-each>
</xsl:template>
Wynik:
Alan Turing 1912 Richard Feynman 1918
xsl:for-each
Modyfikacja:
<xsl:template match="people">
<table border="1">
<tr><td>Name</td><td>Born</td></tr>
<xsl:for-each select="person">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="@born"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
Wynik:
xsl:if
Arkusze XSLT umożliwiają testowanie zawartości elementów dokumentu XML
Wykorzystujemy w tym celu element:
<xsl:if test="warunek">
…
</xsl:if>
Przykład 12
<xsl:template match="people">
<xsl:for-each select="person">
<xsl:value-of select="name"/>
<xsl:if test="@born=‘1912’">
died in <xsl:value-of select="@died"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
Wynik:
Alan Turing died in 1954 Richard Feynman
xsl:choose
Arkusze XSLT umożliwiają przetwarzanie warunkowe zawartości dokumentu
XML.
Wykorzystujemy w tym celu element:
<xsl:choose>
<xsl:when test="warunek">
. . .
</xsl:when>
<xsl:otherwise>
. . .
</xsl:otherwise>
</xsl:choose>
xsl:choose
Przykład 13
<xsl:template match="people">
<xsl:for-each select="person">
<p>
<xsl:value-of select="name"/>
<xsl:choose>
<xsl:when test="@died=‘1912’">
died in 1912
</xsl:when>
<xsl:otherwise>
did not die in 1912
</xsl:otherwise>
</xsl:choose>
</p>
</xsl:for-each>
</xsl:template>
Wynik:
Alan Turing died in 1954 Richard Feynman did not die in 1954
xsl:sort
Arkusze XSLT umożliwiają sortowanie zawartości dokumentu XML.
Wykorzystujemy w tym celu element:
<xsl:sort selection="element">
. . .
</xsl:sort>
Sortowanie ograniczone jest do elementów:
<xsl:apply-templates>. . .</xsl:apply-templates>
<xsl:for-each>. . .</xsl:for-each>
xsl:sort
Przykład 14
<xsl:template match="people">
<xsl:apply-templates>
<xsl:sort select="name"/>
</xsl:apply-templates>
</xsl:template>
Wynik:
Alan Turing computer scientist mathematician cryptographer Richard
Feynman physicist
<xsl:template match="people">
<xsl:apply-templates>
<xsl:sort select="name" order="descending"/>
</xsl:apply-templates>
</xsl:template>
Wynik:
Richard Feynman physicist
mathematician cryptographer
Alan
Turing
computer
scientist
XPath
XPath to język służący do adresowania części dokumentu XML.
Dzięki XPath potrafimy
dokumentu XML.
odwoływać
Rozważmy przykładowy dokument
przykładowe adresowania.
się
do
różnych
elementów
XML
dla
którego
zapiszemy
XPath
<?xml version="1.0"?>
<?xml-stylesheet type="application/xml" href="people.xsl"?>
<people>
<person born="1912" died="1954">
<name>
<first_name>Alan</first_name>
<last_name>Turing</last_name>
</name>
<profession>computer scientist</profession>
<profession>mathematician</profession>
</person>
<person born="1918" died="1988">
<name>
<first_name>Richard</first_name>
<last_name>Feynman</last_name>
</name>
<profession>physicist</profession>
</person>
</people>
XPath
Przykładowe adresowania:
1. Wszystkie elementy person będące dziećmi elementu people
/people/person
Ogólnie
/t1/t2/t3/…/tn
2. Wszystkie elementy person znajdujące się w dokumencie
//person
W przypadku rozważanego
adresowań będą identyczne.
dokumentu
XML
wyniki
powyższych
XPath
3. Atrybut @born znajdujący się w elemencie person
/person/@born
4. Atrybut @born znajdujący się w elemencie person i mający
wartość "1912"
/person/@born="1912"
5. Wszystkie osoby urodzone w roku "1912"
//person[@born="1912"]
6. Pierwszy element person z dokumentu XML
//person[1]
XPath
7. Ostatnia profesja (profession) z pierwszego elementu person
//person[1]/profession[last()]
8. Wszystkie elementy person nie posiadające daty urodzenia
//person[not @born]

Podobne dokumenty