XSL Transformations
XSLT (ang. XSL Transformations, Extensible Stylesheet Language Transformations, w wolnym tłumaczeniu Przekształcenia Rozszerzalnego Języka Arkuszy Stylów) – oparty na XML-u język przekształceń dokumentów XML. Pozwala na przetłumaczenie dokumentów z jednego formatu XML na dowolny inny format zgodny ze składnią XML-a (np. na stronę WWW XHTML, wzór matematyczny MathML lub dokument biurowy ODF), jak również na zwykły HTML i czysty tekst.[1]
Dzięki dużej sile wyrazu[2], łatwości implementacji i powszechnemu stosowaniu XML-a jako standardu dla zapisu informacji, XSLT jest uniwersalnym narzędziem znajdującym zastosowanie w wielu rodzajach oprogramowania. Najbardziej popularne to generowanie stron WWW w serwisach internetowych oraz konwersja pomiędzy alternatywnymi formatami np. w pakietach biurowych.
XSLT jest rozwijany przez W3C jako część rodziny języków XSL (obok XPath i XSL-FO). Powstał pod wpływem języków funkcyjnych oraz języków opartych na dopasowywaniu wzorców (ang. pattern matching) jak awk. Jego bezpośrednim poprzednikiem jest DSSSL, odpowiednik XSLT dla SGML-a.
Najnowszą wersją rekomendacji XSLT jest 2.0, ale ze względu na jej powolne rozpowszechnienie (vide brak obsługi w Xalanie, czy "fabrycznie" na platformie .NET) rekomendacja 1.0 jest nadal powszechnie wykorzystywana.
Spis treści |
[edytuj] Omówienie
XSLT przypomina języki funkcyjne - arkusze XSLT zbudowane są z reguł opisujących, w jaki sposób zamienić poszczególne elementy wejściowego XML-a. Warsztat programisty XSLT obejmuje m.in. instrukcje sterujące, możliwość definicji własnych funkcji (tzw. szablonów nazwanych), funkcje wbudowane realizujące na przykład sortowanie. Do znajdowania i wskazywania elementów źródłowego XML-a używany jest XPath.
[edytuj] Składnia i semantyka
Arkusze XSLT są poprawnymi dokumentami XML. Elementem głównym jest xsl:stylesheet. Prefiks xsl: w używanych w tym dokumencie nazwach elementów oznacza jedynie, że należą one do przestrzeni nazw XSLT - tak więc xsl:stylesheet należy czytać jako element stylesheet z przestrzeni nazw XSLT.
[edytuj] Algorytm transformacji
Każdy procesor XSLT posługuje się przedstawionym poniżej w skrócie algorytmem.
1. Przygotowanie do transformacji:
- Parsowany jest arkusz XSLT oraz wejściowy XML oraz budowane są ich drzewa. Uwzględniony jest fakt, że arkusz XSLT może się składać z wielu plików (instrukcje
xsl:includeixsl:import). - Z dokumentów usuwane są nadmiarowe białe znaki.
- Do drzewa XSLT dołączane są standardowe reguły.
2. Transformacja:
- Tworzony jest główny element drzewa wyjściowego (root node).
- Główna część: przetwarzane są elementy drzewa wejściowego, począwszy od elementu głównego.
- Zwracane jest drzewo wyjściowe, w formacie określonym przez
xsl:output.
Każdy element drzewa wejściowego przetwarzany jest następująco:
- Znajdowany jest najlepiej pasujący szablon. Ze wszystkich szablonów pasujących do przetwarzanego elementu (każdy szablon nienazwany ma wzorzec - atrybut
match) wybierany jest ten o najwyższym priorytecie (obliczonym na podstawie atrybutupriority, postaci wzorca oraz pozycji w dokumencie - elementy zaimportowane mają zawsze najniższy priorytet). - Znaleziony szablon jest aplikowany. Elementy szablonu znajdujące się w przestrzeni nazw XSLT (zazwyczaj te z prefiksem
xsl:) traktowane są jak instrukcje i odpowiednio interpretowane. Reszta jest zwyczajnie kopiowana do drzewa wynikowego. - Jeśli w szablonie umieszczona jest instrukcja
xsl:apply-templates, procesor przechodzi w tym miejscu do rekurencyjnego przetwarzania listy elementów wskazanych atrybutemselectlub - jeśli go brak - wszystkich dzieci aktualnego elementu. Jeśli w szablonie brak jest instrukcjixsl:apply-templates, żadne z elementów aktualnego poddrzewa (dzieci i ich następniki) nie są w tym miejscu dopasowywane (przetwarzane). Należy jednak pamiętać, że mogą zostać przeznaczone do dopasowania (za pomocą instrukcjixsl:apply-templates) z innego szablonu.
[edytuj] Przykład
Powiedzmy, że procesor XSLT transformuje poniższy fragment dokumentu XML:
... <cokolwiek> <DzieckoCokolwiek skąd="skądkolwiek">bum</DzieckoCokolwiek> po bum </cokolwiek> ...
mając do dyspozycji następujące reguły:
<xsl:template match="cokolwiek/DzieckoCokolwiek[@skąd='skądkolwiek']" priority="-1"> <i>(szablon 1)</i> </xsl:template> <xsl:template match="cokolwiek/DzieckoCokolwiek"> <i>(szablon 2)</i> </xsl:template> <xsl:template match="DzieckoCokolwiek"> <i>(szablon 3)</i> </xsl:template>
Produktem transformacji będzie
<i>(szablon 2)</i> po bum
- Brak reguły dla
cokolwiek, użyta więc będzie standardowa każąca przetwarzać wszystkie dzieci po kolei. - Do
DzieckaCokolwiekpasują wszystkie 3 reguły, jednak pierwsza posiada nadany niski priorytet -1, trzecia zaś postać wzorca otrzyma priorytet -0,5 natomiast druga 0. Wybrana więc zostanie druga. - Wewnątrz niej brak instrukcji
xsl:apply-templates, tekstbumzostaje więc pominięty. - Następnie przetwarzane jest drugie dziecko
cokolwiekczyli tekstpo bum. Brak dla niego reguły, stosowana więc jest standardowa.
[edytuj] Zastosowanie w tworzeniu stron WWW
XSLT jest szeroko stosowany przy tworzeniu stron WWW. Pozwala na oddzielenie warstwy informacji od warstwy prezentacji, które w HTML-u są mocno pomieszane. Procesory XSLT wbudowane są w nowoczesne przeglądarki WWW.
[edytuj] Przykład
Załóżmy, że mamy do przedstawienia jakąś książkę. Możemy informacje o niej zapisać w formacie XML:
<?xml version="1.0" encoding="UTF-8"?> <Książka> <id> <Tytuł>Pobawmy się w webmasterów</Tytuł> <isbn>123456789</isbn> <Autor>Jeszcze nieznany</Autor> </id> <SpisTreści> <R>Rozdział 1</R> <R>Rozdział 2</R> <R>Rozdział 3</R> </SpisTreści> </Książka>
Powyżej zawarte są wszystkie informacje, jakie posiadamy o tej książce. Jednak aby wyświetlić ją w przeglądarce potrzebne są jeszcze instrukcje, jak to zrobić. Do tego służy dokument XSLT:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> <xsl:output method="xml" indent="yes" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/> <xsl:template match="książka"> <html> <head> <title>Książka ,,<xsl:value-of select="./id/Tytuł"/>''</title> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="id"> <h3>Dane identyfikacyjne książki</h3> Tytuł: <xsl:value-of select="Tytuł"/><br /> ISBN: <xsl:value-of select="isbn"/><br /> Autor: <xsl:value-of select="Autor"/><br /> </xsl:template> <xsl:template match="SpisTreści"> <h3>Spis treści</h3> <table> <xsl:apply-templates/> </table> </xsl:template> <xsl:template match="R"> <tr><td><xsl:value-of select="."/></td></tr> </xsl:template> </xsl:stylesheet>
Aby transformacja zadziałała, zakładając że szablon znajduje się w pliku książka.xsl, w dokumencie XML dodajemy linijkę
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="książka.xsl"?> <książka> ... </książka>
Przypisy
- ↑ Patrz: rozdział specyfikacji dotyczący możliwych formatów wyjściowych (en).
- ↑ XSLT jest kompletny w sensie Turinga. Dowód w języku angielskim znajduje się na przykład tutaj: A Simple Proof for the Turing-Completeness of XSLT and XQuery.
[edytuj] Linki zewnętrzne
- Rekomendacja XSLT 1.0
- Rekomendacja XSLT 2.0
- XSLT w Mozilla Developer Center
- XSLT - Kursokonferencja
- XSLT w przeglądarkach internetowych
- XSLT w Mozilli
- MSXML Parser - XML-owy silnik IE
- procesory XSLT
- Saxon (Java oraz .NET), saxon.sourceforge.net/)
- AltovaXML 2010, darmowy silnik XSLT 1.0/2.0 (linia komend, COM, Java, .NET, www.altova.com)
- XslCompiledTransform (.NET Framework, msdn.microsoft.com)
- TransforMiiX (C++, www.mozilla.org/projects/xslt/)
- Xalan-Java (Java, xml.apache.org/xalan-j/)
- Xalan-C++ (C++, xml.apache.org/xalan-c/)
- libxslt/xsltproc (C, xmlsoft.org/XSLT/)
- XT (Java, http://www.blnz.com/xt/index.html, autor James Clark)
- Sablotron (C++, www.gingerall.com/charlie/ga/xml/p_sab.xml)
- msxsl.exe (C++, msdn.microsoft.com)
- PHP 5 funkcje XSLT (PHP 5, http://www.php.net/manual/en/book.xsl.php)
|
|||||||||||||||||||