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 elementy wejściowe pliku XML. jaki sposób przekształcić poszczególne dokument XML arkusz XSLT procesor 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 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: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: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: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: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: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: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 match="person"> <xsl:apply-templates select="name"/> </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>
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 match="person"> <xsl:apply-templates select="name"/> </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"> Jeżeli chcemy odwołać się do wszystkich atrybutów jako nazwe_atrybutu podajemy *: <xsl:template match="@*">
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: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/> * - 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 match="pe:name"> <p> <xsl:value-of select="pe:last_name"/> <xsl:value-of select="pe:first_name"/> </p> <xsl:template match="pe:person"> <xsl:apply-templates select="pe:name"/> </xsl:stylesheet>
xsl:for-each Arkusze XSLT umożliwiają iteracyjne przeglądanie elementów dokumentu XML Wykorzystujemy w tym celu element: Przykład 11 <xsl:for-each select="nazwa_elementu"> </xsl:for-each> <xsl:template match="people"> <xsl:for-each select="person"> <xsl:value-of select="name"/> <xsl:value-of select="@born"/> </xsl:for-each> Wynik: Alan Turing 1912 Richard Feynman 1918
xsl:for-each Modyfikacja: Wynik: <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: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 Wynik: <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> 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> 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 Wynik: <xsl:template match="people"> <xsl:apply-templates> <xsl:sort select="name"/> </xsl:apply-templates> 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> Richard Feynman physicist Alan Turing computer scientist mathematician cryptographer
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.
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 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]
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]