XML - ćwiczenia 9 - XSLT, XPath

Referencje

Rekomendacje

XSLT
XPath
XSL

Narzędzia

Procesory XSLT:
Xalan (Java, projekt Apache)
Xalan (C++, projekt Apache)
libxml (C)
Sablotron (C)
Internet Explorer i wiele programów pod Windows korzysta z biblioteki MSXML.

Dokumentacja JAXP - standard określa m.in. jaki interfejs powinny mieć procesory XSLT w Javie.
API pakietu javax.xml.transform - standardowy pakiet do transformacji w Javie 1.4.

Technika

W naszym labie działa takie polecenie:
java org.apache.xalan.xslt.Process -XSL szablon.xsl -IN wejscie.xml -OUT wynik.html

Internet Explorer i Mozilla potrafią też dokonywać tranformacji XSLT zgodnie z deklaracją stylu podaną w dokumencie XML:
<?xml-stylesheet type="text/xsl" href="szablon.xsl"?>

XSL

Extensible Stylesheet Language, rekomendacja W3C określa sposób prezentacji dokumentów XML opraty o transformacje dokumentów.
Tym razem arkusz określa sposób zamiany dokumentu XML na inny dokument XML, dla którego określony jest już sposób prezentacji. Zgodnie z ideą standardu XSL wyjściowym powinien być dokument XSL "Formatting Objects", ale w praktyce najczęściej dokonuje się tranformacji do XHTML.
XSL = XSLT (język transformacji) + "FO" (język prezentacji).

XSLT

XSL Transformations, rekomendacja W3C to język (zastosowanie XML) służący do pisania arkuszy dokonujących transformacji XML -> XML. Procesor XSLT to aplikacja, która potrafi interpretować XSLT i mając dane wejściowy dokument XML i arkusz XSLT potrafi wygenerować wyjściowy dokument XML.

Arkusz (stylesheet) składa się z szablonów (templates). Każdy szablon opisuje jak zamieniać pewien fragment dokumentu wejściowego na fragment dokumentu wyjściowego. Wykonanie tranformacji polega na wywołaniu szablonu pasującego do elementu głównego.

Kiedy obliczany jest szablon dla danego węzła, ten węzeł staje się węzłem bieżącym. Instrukcje, które zmieniają węzeł bieżący to: apply-templates i for-each.

XSLT językiem deklaratywnym

Treść szablonu jest wyrażeniem opisującym zawartość dokumentu wynikowego. Nie ma tutaj imperatywnych poleceń modyfikujących stan, wypisujących coś na wyjście itd., dlatego XSLT można uznać za język deklaratywny, w pewnych aspektach przypominający języki funkcyjne (konstrukcja let x=... in ..., co prawda trochę inny, ale "pattern-matching").

Serializacja

Wynikiem transformacji jest dokument XML. Standard określa trzy sposoby serializacji (zapisania jako tekstu) wynikowych dokumentów:

  1. XML - zapisywany jest dokument XML,
  2. HTML - jeśli wynikiem jest XHTML, zostaje on zapisany jako HTML (jest poprawnie interpretowany przez stare przeglądarki),
  3. TEXT - zapisywana jest zawartość tekstowa elementów, bez znaczników. Ten sposób umożliwia tworzenie z XML dowolnych dokumentów tekstowych (np. płaski tekst, Latex, Postscript :), a nawet języki programowania). (Wada XSLT: nie mechanizmów pozwalających zastępować niektóre znaki specjalne innymi ciągami znaków, np. zastępować \ przez \\.)

Zastosowania XSLT są znacznie szersze niż prezentacja XML.

Struktura arkusza XSLT

element główny:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

konfiguracja arkusza:
  <xsl:output method="html" encoding="iso-8859-2" />
  <xsl:import href="inny_arkusz.xsl"/>

szablony:
  <xsl:template match="/">
    <html><body><xsl:apply-templates/></body></html>
  </xsl:template>

  <xsl:template match="podelement">
    <p><xsl:value-of select="."/></p>
  </xsl:template>
</xsl:stylesheet>

Dopasowywanie wzorca

Atrybut match w elemencie template mówi do jakich węzłów dany szablon będzie aplikowany. Jego wartością powinien być wzorzec - coś na kształt ścieżki XPath. Ten sam węzeł może pasować do wielu szablonów i ich pól match. Wówczas intuicyjnie wybierany jest ten szablon, który najbardziej precyzyjnie określa dany węzeł - dokładnie opisuje to rekomendacja.

XPath

W XSLT do adresowania fragmentów przetwarzanego dokumentu, a także do zapiwywania innych wyrażeń służy język XPath.

XML Path Language, rekomendacja W3C to język wyrażeń pozwalający na zaadresowanie fragmentu dokumentu XML oraz wiele innych rzeczy (arytmetyka liczb całkowitych i logiki, wbudowane użyteczne funkcje).

XPath a DOM

XPath definiuje drzewiasty model dokumentu XML, podobny do DOM, ale z pewnymi subtelnymi różnicami, m.in. w XPath w przezroczysty sposób są wklejane sekcje CDATA i wartości encji. XPath, w odróżnieniu od DOM, nie stanowi interfejsu programistycznego dla dokumentu, wyrażenia XPath pozwalają jedynie odczytywać fragmenty dokumentu.

Typy wyrażeń XPath

Ścieżki XPath

Najważniejszy rodzaj wyrażeń. Ich wynikiem jest wartość typu node set, służą do odczytywania (adresowania) fragmentów dokumentu. Podstawowa składnia:
krok/krok ...
Gdzie krok to:
::test-węzłów [predykat] [predykat] ... .
Można stosować różne skróty notacyjne. Domyślną osią jest child, rozpoczęcie nazwy węzła od @ oznacza atrybut, * pasuje do każdej nazwy a // oznacza wszystkich potomków (nie tylko dzieci jak /).

Węzeł kontekstowy i bieżący

Każde wyrażenie XPath obliczane jest w pewnym kontekście, na który składają się węzeł kontekstowy, jego pozycja (względem bliźniaków), środowisko zmiennych itp.
W XSLT zawsze jest określony węzeł bieżący, w wyrażeniach XPath można się do niego odwołać za pomocą funkcji current(), w każdym miejscu w ścieżce XPath current() ma tą samą wartość.
Węzeł kontekstowy na samym początku obliczania wyrażenia jest równy węzłowi bieżącemu, a dalej w miarę przechodzenia kolejnych kroków ścieżki XPath zmienia się. W każdym miejscu można się do niego odwołać za pomocą kropki .
Przykład:
//section[current()/@id = 'S3'] - wszystkie elementy section, jeśli bieżący węzeł ma parametr id równy S3;
//section[./@id = 'S3'] - wszystkie elementy section, które mają parametr id równy S3;

Zadania

Wykorzystać XPath Vizualizer (jeśli można...).

  1. Przykład adresy. Napisz ścieżki określające:
  2. Przykład authors2. Napisz ścieżki określające: