Gdzie warto zajrzeć ...


idź do góry

Czym jest XSL ?


XSL jest skrótem od EXtensible Stylesheet Language co w wolnym tłumaczeniu oznacza "rozszerzalny język stylów". Jest on tym samym dla XML czym CSS dla HTML.

HTML wykorzystuje jednak dobrze zdefiniowane znaczniki, których znaczenie jest opisane i znane powszechnie. Tak więc dodanie stylów prezentujących zawartość dokumentu HTML w nowy urozmaicony sposób (np. zmiana kolorów, kroju czcionki) jest prosta i wymaga jedynie stworzenia stylu CSS i połączenia go z konkretnym dokumentem HTML.

W przypadku XML, sprawa jest nieco bardziej skomplikowana, ponieważ XML nie wykorzystuje predefiniowanych znaczników. Są one definiowane przez użytkownika, a ich znaczenie nie jest powszechnie znane. To XSL opisuje w jaki sposób dokument XML ma zostać zaprezentowany.

Można wyróżnić 3 składowe XSL:
  • XSLT - język trasformacji dokumentów XML
  • XPath - język do nawigacji w dokumentach XML
  • XSL-FO - język do formatowania dokumentów XML
XSLT jest skrótem od XSL Transformations. Jak wcześniej wspomniano jest to język służący do pisania arkuszy dokonujących transformacji dokumentów XML. Jest to język deklaratywny, co oznacza, że treść szablonu jest wyrażeniem opisującym zawartość dokumentu wynikowego. Nie istnieją imperatywne polecenia, które umożliwiają modyfikację stanu, wypisanie czegokolwiek na wyście etc.

Wynikiem wspomnianej wcześniej transformacji jest wynikowy dokument, który może być zapisany jako:
  • xml – zapisywany jest dokument XML,
  • text – wypisanie tylko węzłów tekstowych dokumentu, bez żadnych znaczników,
  • html – zapisywany jako HTML, (wynikiem jest drzewo dokumentu HTML, które jest poprawnie interpretowane przez stare przeglądarki)
idź do góry

Element <xsl:stylesheet>


Elementem, który informuje o tym że dany dokument jest arkuszem stylów XSL jest element <xsl:stylesheet> lub element <xsl:transform>. Są one sobie równoznaczne i standard dopuszcza stosowanie dowolnego z nich.

Poniżej zaprezentowano poprawny przykład deklaracji arkusza stylów XSL, zgody z rekomendacją W3C.
 <xsl:stylesheet version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
lub
 <xsl:transform version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Pojawiająca się w przykładzie deklaracja przestrzeni nazw xmlns:xsl wskazuje oficjalną przestrzeń nazw XSLT zdefiniowaną przez W3C . Umożliwia to wykorzystanie elementów, atrybutów i innych cech języka XSLT. idź do góry

Element <?xml-stylesheet>


Element <?xml-stylesheet> pozwala na połączenie dokumentu XML z odpowiednim stylem XSLT.
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <?xml-stylesheet type="text/xsl" href="addrBook.xsl"?>
 <addressBook>
   <person>
     <name>John Smith</name>
     ...
   </person>
   ...
 <addressBook>
idź do góry

Element <xsl:template>


Działanie transformacji polega na dopasowywaniu szablonów do węzłów i wykonaniu zawartych w nich instrukcji. Proces ten jest powtarzany tak długo jak to możliwe, czyli aż wszystkie wzorce zawarte w dokumencie XSLT zostaną dopasowane i powstanie dokument wynikowy, lub do momentu, w którym procesor XSLT wykryje nieskończoną pętlę :( i i poinformuje o tym fakcie za pomocą stosownego komunikatu o błędzie.

Element <xsl:template> pozwala zdefiniować szablon, do którego będzie dopasowywana zawartość wejściowego dokumentu XML. Atrbyut match pozwala sprecyzować do jakiego elementu XML dany szablon ma być dopasowywany. Wartością tego atrybutu jest wyrażenie XPath.
 <xsl:template match="...">
   ...
 </xsl:template>
idź do góry

Element <xsl:apply-templates>


Element <xsl:apply-templates> pozwala zastosować określony szablon do elementu obecnie przetwarzanego lub do jego elementów podrzednych. Dodając atrybut select możemy ograniczyć elementy dopasowywane tylko do tych, które pasują do wartości tego atrybutu. Ponadto wartość tego atrybut może określać porządek w jakim będa przetwarzane węzły podrzędne.

Składnia tego elementu jest następująca:
 <xsl:apply-templates select="EXPRESSION"/>
Przykład:
 1<xsl:template match="rozklad">
 2  <html>
 3    <head>
 4      <title>Rozkład jazdy</title>
 5    </head>
 6    <body>
 7      <ul>
 8        <xsl:apply-templates/>
 9      </ul>
10    </body>
11  </html>
12</xsl:template>

[pokaż zawartość pliku] [pobierz plik] idź do góry

Element <xsl:value-of>


Element <xsl:value-of> umożliwia pobranie danych z elementu XML znajdującego się w pliku wejściowym i przekazanie go do strumienia wyjściowego. Atrybut select jest wyrażeniem XPath, które określa jakie dane mają zostać pobrane. Element ten ma następującą składnię:
 <xsl:value-of select="..."/>
Przykład:
 1<xsl:template match="linia">
 2  <li>
 3    linia nr. <xsl:value-of select="numer"/>: 
 4    <xsl:value-of select="poczatek"/> -> <xsl:value-of select="koniec"/>        
 5  </li>
 6</xsl:template>

[pokaż zawartość pliku] [pobierz plik] idź do góry

Element <xsl:variable>


Przykład:
 1 <xsl:variable name="copyright">
 2   copyright by Jan Kowalski
 3 </xsl:variable>

 4 <xsl:variable name="fromTo" select=" -> " />
 5 
 6 <xsl:template match="rozklad">
 7  <html>
 8    <head>
 9      <title>Rozkład jazdy</title>
10    </head>
11    <body>
12      <ul>
13        <xsl:apply-templates/>
14      </ul>
15      <hr />
16      <xsl:copy-of select="$copyright"/>
17    </body>
18  </html>
19</xsl:template>

20<xsl:template match="linia">
21  <li>
22    linia nr. <xsl:value-of select="numer"/>: 
23    <xsl:value-of select="poczatek"/>
24    <xsl:copy-of select="$fromTo"/>
25    <xsl:value-of select="koniec"/>        
26  </li>
27</xsl:template>

[pokaż zawartość pliku] [pobierz plik] idź do góry

Tryby przetwarzania


Istnieją dwa style przetwarzania dokumentów

Przetwarzanie ukierunkowane na strukturę dokumentu wynikowego

jeden duży szablon, określający dokładnie strukturę wynikową a do dokumentu wejściowego odwołujący się za pomocą (często bezwzględnych) ścieżek XPath, elementów for-each. Dobry gdy wynik musi mieć ściśle określoną strukturę.

Przetwarzanie ukierunkowane na strukturę dokumentu wejściowego

Wiele małych szablonów dla poszczególnych węzłów dokumentu wejściowego i sterowanie za pomocą apply-templates. Struktura wynikowa nie jest jednoznacznie ustalona. Nadaje się do przetwarzania dokumentów o nieustalonej strukturze, modelu mieszanego, elementów zagnieżdżonych rekurencyjnie.

W praktyce często wykorzysuje się oba style. Przykładem może być sytuacja, w której generujemy wynikowy dokument w formacie HTML. Struktura dokumentu HTML powstaje przy zastosowaniu pierwszego z podejść, natomiast zawartość powstaje jako efekt zastosowania drugiego z nich. idź do góry

Element <xsl:for-each>


Element <xsl:for-each> odpowiada pętli for znanej z języków programownia. Pozwala on na wskazanie wszystkich elementów XML znajdujących się w określonym miejscu dokumentu wskazanym przez wartość atrbytutu select, która jak poprzednio jest wyrażeniem XPath.

Składnia tego elementu jest następująca:
 <xsl:for-each select="EXPRESSION"/>
   TEMPLATE
 </xsl:for-each>
Przykład:
 1<xsl:template match="rozklad">
 2  <html>
 3    <head>
 4      <title>Rozkład jazdy</title>
 5    </head>
 6    <body>
 7      <ul>
 8        <xsl:apply-templates/>
 9      </ul>
10      <h2>Linie remontowane:</h2>
11       <xsl:for-each select="linia[@status=remontowana]">
12               linia nr. <xsl:value-of select="numer"/> <br />
13       </xsl:for-each>
14      <hr />
15      <xsl:copy-of select="$copyright"/>
16    </body>
17  </html>
18</xsl:template>

[pokaż zawartość pliku] [pobierz plik] idź do góry

Element <xsl:sort>


Element <xsl:sort> definiuje klucz sortowania dla węzłów wybranych przez <xsl:apply-templates> lub <xsl:for-each> i określa kolejność, w jakiej mają być one przetwarzane.

Składania tego elementu jest następująca:
 <xsl:sort
          select=EXPRESSION
          order="ascending" | "descending"
          case-order="upper-first"| "lower-first"
          lang=XML:LANGUAGE-CODE
          data-type="text" | "number" /> 
gdzie atrybuty mają następujące znaczenie:
select
Używa wyrażenia XPath do określenia węzłów, które mają zostać posortowane.
order
Określa czy węzły mają być przetwarzane w kolejności "ascending" (rosnącej) lub "descending" (malejącej). Wartością domyślną jest "ascending".
case-order
Wskazuje, które z liter (małe czy duże) mają być uporządkowane jako pierwsze. Dostępnymi wartościami są "upper-first" (najpierw duże) i "lower-first" (najpierw małe).
lang
Określa, który język ma zostać użyty przez sortowanie.
data-type
Definiuje czy pozycje mają być uporządkowane alfabetycznie czy numerycznie. Dostępnymi wartościami są "text" (alfabetycznie) i "number" (numerycznie) z "text" jako wartością domyślną.
Przykład:
 1<xsl:template match="rozklad">
 2  <html>
 3    <head>
 4      <title>Rozkład jazdy</title>
 5    </head>
 6    <body>
 7      <ul>
 8        <xsl:apply-templates/>
 9      </ul>
10      <h2>Linie remontowane:</h2>
11      <xsl:for-each select="linia[@status=remontowana]">
12        <xsl:sort order="ascending" data-type="number" select="numer"/>
13        linia nr. <xsl:value-of select="numer"/><br />
14      </xsl:for-each>
15      <hr />
16      <xsl:copy-of select="$copyright"/>
17    </body>
18  </html>
19</xsl:template>

[pokaż zawartość pliku] [pobierz plik] idź do góry

Element <xsl:if>


Element <xsl:if> pozwala zapisać wyrażenie warunkowe, które na podstawie zawartości wejściowego dokumentu XML i wartości wyrażenia wykona odpowiednie transformacje lub je pominie. Element ten jest podobny do instrukcji if then w innych językach programowania

Element ten ma następującą składnię:
 <xsl:if test="EXPRESSION">
     TEMPLATE
 </xsl:if>
Przykład:
 1<xsl:template match="linia">
 2  <li>
 3    linia nr. <xsl:value-of select="numer"/>: 
 4    <xsl:value-of select="poczatek"/>
 5    <xsl:copy-of select="$fromTo"/>
 6    <xsl:value-of select="koniec"/>        
 7    <xsl:if test="@status">
 8      <b> 
 9      (UWAGA: Obecnie linia jest <xsl:value-of select="@status"/>)
10      </b>
11    </xsl:if>
12  </li>
13</xsl:template>

[pokaż zawartość pliku] [pobierz plik] idź do góry

Element <xsl:choose>


Element <xsl:choose> jest stosowany w połączeniu z elementami <xsl:when> i <xsl:otherwise>, w celu zapisania wielokrotnych wyrażeń warunkowych. Element ten odpowiada konstrukcji if .. then .. else znanej z innych języków programowania.

Składnia tego elementu jest następująca:
 <xsl:choose>
  <xsl:when test="EXPRESSION">
    TEMPLATE
  </xsl:when>
  <xsl:otherwise>
    TEMPLATE
  </xsl:otherwise>
</xsl:choose>
Przykład:
 1<xsl:template match="linia">
 2  <li>
 3    linia nr. <xsl:value-of select="numer"/>: 
 4    <xsl:value-of select="poczatek"/>
 5    <xsl:copy-of select="$fromTo"/>
 6    <xsl:value-of select="koniec"/>        
 7    <xsl:if test="@status">
 8      <b> (UWAGA !: Linia w chwili obecnej jest <xsl:value-of select="@status"/>)</b>
 9    </xsl:if>
10    <br />
11    <xsl:choose>
12      <xsl:when test="count(przystanek)>0">
13        przez: <xsl:apply-templates select="przystanek" /> 
14      </xsl:when>
15      <xsl:otherwise>
16        trasa nie została opisana
17      </xsl:otherwise>
18    </xsl:choose>
19  </li>
20</xsl:template>

21<xsl:template match="przystanek">
22    <xsl:value-of select="."/>,
23</xsl:template>

[pokaż zawartość pliku] [pobierz plik] idź do góry