XSL Transformations

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj
Proces transformacji XSLT 1.0

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.

Omówienie[edytuj | edytuj kod]

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.

Składnia i semantyka[edytuj | edytuj kod]

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.

Algorytm transformacji[edytuj | edytuj kod]

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:include i xsl: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 atrybutu priority, 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 atrybutem select lub - jeśli go brak - wszystkich dzieci aktualnego elementu. Jeśli w szablonie brak jest instrukcji xsl: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ą instrukcji xsl:apply-templates) z innego szablonu.

Przykład[edytuj | edytuj kod]

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 DzieckaCokolwiek pasują 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, tekst bum zostaje więc pominięty.
  • Następnie przetwarzane jest drugie dziecko cokolwiek czyli tekst po bum. Brak dla niego reguły, stosowana więc jest standardowa.

Zastosowanie w tworzeniu stron WWW[edytuj | edytuj kod]

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.

Przykład[edytuj | edytuj kod]

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

Linki zewnętrzne[edytuj | edytuj kod]