Reguły XSLT są wyrażane przy pomocy wzorców (templates) składających się z części pozwalającej na sprawdzenie czy dana reguła powinna zostać zastosowana do bieżącego elementu drzewa XML i z zawartości wzorca czyli tego co ma się pojawić w wynikowym drzewie po napotkaniu pasującego elementu drzewa. Elementy dokumentu XML są kolejno dopasowywane do wzorców i w ten sposób, poruszając się w głąb źródłowego drzewa, tworzone jest drzewo dokumentu wynikowego. W szczególności wynikami działania transformacji XSLT może być również HTML lub czysty tekst:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<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>
Spróbujmy wkleić powyższy przykład i obejrzeć wynik. Jest on oczywiście niezależny od danych w pliku XML.
Wewnątrz elementu xsl:template możemy przy pomocy xsl:for-each i odpowiedniego wyrażenia Xpath wybrać, jakie elementy mają być przeznaczone do wyświetlenia przez xsl:value-of select.
<xsl:for-each select="osoby/osoba">
<xsl:value-of select="imie" />
<xsl:value-of select="nazwisko" />
</xsl:for-each>
Umieśćmy w odpowiednim miejscu (czyli w sekcji BODY) powyższy fragment kodu. I zobaczyć, jak będzie wyglądał wynik. Może warto dodać trochę znaczników HTML, żeby osoby były wyświetlane np. w tabeli?
Reguł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.
Aby 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/>
Przeróbmy teraz poprzedni przykład tak, aby w „ciele” dokumentu znalazło się <xsl:apply-templates/>:
O poprzednim przykładzie (z użyciem for-each) możemy chwilowo zapomnieć.
<xsl:apply-templates/>
</body>
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. Rozważmy następujący szablon XSL:
<html><head><title>API</title></head><body>
</body></html>
<xsl:template match="procesor">
<p>
<xsl:value-of select="typ"/>
<xsl:value-of select="@predkosc"/>
</p><hr/>
Widzimy, że:
· Dla korzenia drzewa „/” zostanie stworzony nagłówek <HTML>,<HEAD>, <BODY>
· Dla każdego wystąpienia elementu <procesor>, zostanie stworzony nowy paragraf <P> i zostanie wyświetlony jego typ oraz prędkość (znak @ oznacza, że jest to atrybut) oraz pojawi się pozioma linia.
Na podstawie powyższego przykładu, stwórzmy szablon XSL wyświetlający dane ze stworzonego wcześniej pliku XML.
Możemy też zrobić tak:
<xsl:template match="procesory/*/cena">
<strong><xsl:value-of select="."/></strong>
Lub tak:
<xsl:value-of select="." />
W apply-templates możemy użyć atrybutu select:
<xsl:apply-templates select="ATOM"/>
Ponieważ przy wyświetlaniu parser usuwa pojedyncze spacje, warto czasem temu zapobiec:
<xsl:template match="/" xml:space="preserve">
xsl:text pozwala na umieszczanie tekstu w wynikowym dokumencie. Korzyści jakie oferuje ten element, są dwie:
· zachowuje białe znaki,
· pozwala na umieszczenie znaków <, >, & - w wynikowym tekście poprzez zastąpienie sekwencji < > czy &
Przykład – javascript w XSL:
<xsl:template match="SCRIPT">
<script language="javascript">
<xsl:text disable-output-escaping="yes">
<!-- if (
location.host.toLowerCase().indexOf("metalab") < 0
&& location.host.tolowercase().indexof("sunsite") < 0) {
location.href="http://metalab.unc.edu/xml/";
}
} -->
</xsl:text>
</script>
Spróbujmy wstawić do naszego dokumentu jakiś dodatkowy tekst np. nagłówek przy pomocy xsl:text. Może się to też przydać do uzyskania np. spacji.
Element xsl:choose pozwala na wybór akcji jaka ma być podjęta. Zawiera on zbiór elementów xsl:when których atrybut test podlega obliczeniu i jeśli wynikiem jest true wykonywany jest blok w nich zawarty. Jeśli więcej niż jeden warunek jest prawdziwy wykonuje się pierwszy w kolejności.
<xsl:choose>
<xsl:when test="@waga='15'">
<P><FONT COLOR="red">
</FONT></P>
</xsl:when>
<xsl:otherwise>
<P><FONT COLOR="blue">
</xsl:otherwise>
</xsl:choose>
W tym przykładzie inny kolor tekstu będą miały elementy o atrybucie równym 15 (czerwony) a inny pozostałe (niebieski)
Przeróbmy teraz swój szablon tak, aby w zależności od jakiegoś warunku (np. płci), wyświetlane osoby podlegały innemu formatowaniu (np. kolor, czcionka).
Gdy wpiszemy w dokumencie XML odnośnik do szablonu, będzie on interpretowany przez przeglądarkę. Poniższą linijkę wystarczy wstawić do dokumentu XML tuż po <?XML version=... Oczywiście zamiast g.xsl musimy wprowadzić nazwę (i ewentualnie ścieżkę) do szablonu XSL. W tym momencie, po otwarciu naszego dokumentu XML w przeglądarce, powinien on się pojawić w postaci sformatowanej przez XSLT.
<?xml-stylesheet type="text/xsl" href="g.xsl" ?>
Doprowadź do sytuacji, w której Twój dokument sformatowany przez XSL będzie wyświetlany przez przeglądarkę internetową, bez programu XML Cooktop.
yoquero