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.
dokument XML
arkusz XSLT
plik wyjściowy
(XML, HTML, PDF etc.)
procesor XSLT
Arkusze XSLT określają w jaki sposób przekształcić poszczególne elementy wejściowe pliku XML.
XSLT i przeglądarki
<?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>
Struktura XSLT
Arkusz XSLT ma następującą strukturę
W dokumencie XML, który ma być przekształcamy umieszczamy
<?xml-stylesheet type="application/xml" href="people.xsl"?>
Zapisujemy go w pliku z rozszerzeniem xsl np. people.xsl.
<?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>
Dołączenie XSLT
Rozważmy następujący dokument XML
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>
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.
xsl:template
XSLT
Przykład 4
<?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>
Arkusz XSLT musi być (jako dokument XML) poprawny składniowo (ang. well formed).
Poniższy arkusz XML nie jest poprawny składniowo.
Musi zatem spełniać wszystkie wymagania związane z poprawnością składniową.
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>
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 elementu template są węzły przetwarzanego
dokumentu XML.
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:apply-templates
Przykład 6
<?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>
W poniższym przykładzie wybieramy wartości elementów last_name i first_name będących dziećmi elementu name.
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
xsl:value-of
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.
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".
xsl:apply-templates
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)
<?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
Rozważamy następujący dokument XML:
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
<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>
Przykład 8 cd
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>
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 - atrybuty
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>
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>
XSLT – przestrzenie nazw
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
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:for-each
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:if
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
Wynik:
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>
Alan Turing died in 1954 Richard Feynman did not die in 1954
xsl:choose
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
Wynik:
Przykład 14
<xsl:template match="people">
<xsl:apply-templates>
<xsl:sort select="name"/>
</xsl:apply-templates>
</xsl:template>
Alan Turing computer scientist mathematician cryptographer Richard Feynman physicist
Wynik:
<xsl:template match="people">
<xsl:apply-templates>
<xsl:sort select="name" order="descending"/>
</xsl:apply-templates>
</xsl:template>
Richard Feynman physicist Alan Turing computer scientist mathematician cryptographer
xsl:sort
XPath
XPath to język służący do adresowania części dokumentu XML.
Dzięki XPath potrafimy odwoływać się do różnych elementów dokumentu XML.
Rozważmy przykładowy dokument XML dla którego zapiszemy przykładowe adresowania.
<?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
XPath
1. Wszystkie elementy person będące dziećmi elementu people
Przykładowe adresowania:
/people/person
2. Wszystkie elementy person znajdujące się w dokumencie
//person
Ogólnie
/t1/t2/t3/…/tn
W przypadku rozważanego dokumentu XML wyniki powyższych adresowań będą identyczne.
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]
7. Ostatnia profesja (profession) z pierwszego elementu person
//person[1]/profession[last()]
XPath
8. Wszystkie elementy person nie posiadające daty urodzenia
//person[not @born]
Top Related