XSL Transformations

Z Wikipedii, wolnej encyklopedii
(Przekierowano z XSLT)
Skocz do: nawigacja, szukaj
Proces transformacji XSLT 1.0

XSLT (ang. XSL Transformations, Extensible Stylesheet Language Transformations) – oparty na XML 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 (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 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.

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. 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 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 DzieckoCokolwiek 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]