Podstawy XSLT |
|||||||||||||||||
Transformacje opisywane przez XSLT są zapisywane jako poprawny dokument XML'a, który może zawierać zarówno elementy należące do specyfikacji języka XSLT (które zawsze należą do przestrzeni nazw xsl) jaki i elementy użytkownika. Transformacja wyrażona w XSLT zawiera zbiór reguł opisujących przekształcenie jednego drzewa XML w nowe. <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <head><title> Zniszczony dokument </title></head> <body> <p> <b>Właśnie zignorowaliśmy treść dokumentu wejściowego</b> </p> </body> </html> </xsl:template> </xsl:stylesheet> Przykład ten spowoduje, że każdy dokument XMLa zostanie przekształcony w plik HTML, zawierający tylko tytuł i jeden paragraf: <html> <head><title> Zniszczony dokument </title></head> <body> <p> <b>Właśnie zignorowaliśmy treść dokumentu wejściowego</b> </p> </body> </html> Przykład ten ma bardzo skromne możliwości, ale pozwala na wskazanie najważniejszych elementów dokumentu XSL. W przykładzie obecna jest tylko jedna reguła: <xsl:template match="/"> ... </xsl:template >Ta reguła pasuje do korzenia każdego dokumentu (match="/"). Zostaje wykonana jej treść, czyli wynikowy dokument zostanie utworzony w oparciu o zawartość węzła <xsl:template>. Ponieważ nie zawiera on żadnych instrukcji języka XSL będą tylko skopiowane wszystkie elementy zawarte we wzorcu. Dzięki czemu powstanie nagłówek dokumentu HTML i jego treść. xsl:templateReguły definiowane przez element xsl:template są najważniejszą częścią arkusza XSL. Wiążą one elementy wejściowego dokumentu z wynikowymi. Każdy element xsl:template zawiera atrybut match, który decyduje o tym dla jakich węzłów wejściowego dokumentu ma zostać wykonana reguła. <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <head><title> Zniszczony dokument </title></head> <body> <p> <b>Właśnie zignorowaliśmy treść dokumentu wejściowego</b> </p> </body> </html> </xsl:template> </xsl:stylesheet> Zawartość elementu xsl:template to właśnie opis reguły do wykonania, może ona zawierać instrukcje XSL'a (tagi z przestrzeni nazw xsl), jak i dowolne elementy, które zostaną po prostu skopiowane do wynikowego drzewa. xsl:apply-templatesAby móc przetwarzać dokument musimy mieć możliwość zejścia w dół drzewa dokumentu, czyli powiadomić procesor XSL'a które dzieci drzewa należy przetwarzać. Służy do tego element: <xsl:apply-templates/>
Poprzez umieszczenie we wzorcu tego elementu powiadamiamy parser, że ma przeglądać dzieci obecnego węzła i szukać reguł do nich pasujących a następnie je wykonać. Ponieważ kolejne wzorce również mogą zawierać element xsl:apply-template możliwe jest przejście całego drzewa.
<?xml version="1.0"?> <?xml-stylesheet type="text/xml" href="14-2.xsl"?> <PERIODIC_TABLE> <ATOM STATE="GAS"> <NAME>Hydrogen</NAME> <SYMBOL>H</SYMBOL> <ATOMIC_NUMBER>1</ATOMIC_NUMBER> <ATOMIC_WEIGHT>1.00794</ATOMIC_WEIGHT> <BOILING_POINT UNITS="Kelvin">20.28</BOILING_POINT> <MELTING_POINT UNITS="Kelvin">13.81</MELTING_POINT> <DENSITY UNITS="grams/cubic centimeter"><!-- At 300K --> 0.0899 </DENSITY> </ATOM> <ATOM STATE="GAS"> <NAME>Helium</NAME> <SYMBOL>He</SYMBOL> <ATOMIC_NUMBER>2</ATOMIC_NUMBER> <ATOMIC_WEIGHT>4.0026</ATOMIC_WEIGHT> <BOILING_POINT UNITS="Kelvin">4.216</BOILING_POINT> <MELTING_POINT UNITS="Kelvin">0.95</MELTING_POINT> <DENSITY UNITS="grams/cubic centimeter"><!-- At 300K --> 0.1785 </DENSITY> </ATOM> </PERIODIC_TABLE> oraz następujący arkusz xsl'a: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <xsl:apply-templates/> </html> </xsl:template> <xsl:template match="PERIODIC_TABLE"> <body> <xsl:apply-templates/> </body> </xsl:template> <xsl:template match="ATOM"> An Atom </xsl:template> </xsl:stylesheet> Jeśli użyjemy tego arkusza będą dokonywane następujące czynności:
<html><body> An Atom An Atom </body></html> Aby móc precyzować dla jakich dzieci bieżącego elementu mają być poszukiwane wzorce można użyć atrybutu select elementu xsl:apply-templates. Jeśli ostatnią regułę zastąpimy: <xsl:template match="ATOM"> <xsl:apply-templates select="NAME"/> </xsl:template> To jako wynik dostaniemy dokument: <html><body> Hydrogen Helium </body></html> xsl:value-ofTag xsl:value-of zwraca wartość elementu określonego przez atrybut select. I tak poprzedni przykład da się zrealizować przy pomocy: <xsl:template match="ATOM"> <xsl:value-of select="NAME"/> </xsl:template>
Wartością xsl:value-of jest zawsze napis, którego treść zależy od zawartości elementu i jego rodzaju. Dla węzłów będzie to konkatenacja wszystkich napisów znajdujących się pomiędzy tagiem otwierającym i zamykającym elementu.
Hydrogen H 1 1.00794 1 20.28 13.81 0.0899 Sposób wyliczanie wartości w zależności od rodzaju węzła zawiera tabela:
|