6. XSLT

Po seznámení s XML dokumenty a jazykem XPath se podíváme na další způsob, jak lze transformovat XML dokument jiným způsobem než ono generování programovat přímo v nějakém obecném programovacím jazyce.

Speciálním jazykem pro transformaci XML dokumentů na jinou formu (např. HTML, PDF, PS apod) je právě jazyk XSLT (eXtensible Stylesheet Language Transformations). XSLT lze vyjádřit následujícím obrázkem

Obrázek 8.1. Transformace XML na uživatelský formát

Transformace XML na uživatelský formát

Tedy k tomu, aby bylo možno XML dokument transformovat, je zapotřebí k XML dokumentu vytvořit navíc XSLT styl. Ten XSLT procesoru říká, jakým způsobem má jednotlivé značky v XML dokumentu transformovat na výstupní značky. Existují různé implementace XSLT procesorů (Saxon, Xalan, XT...), jelikož ale procházíme kurzem C#, zaměříme se na procesor dostupný v .NET Framework.

6.1. Tvorba XSLT Stylesheets

Styly pro generování z XML dokumentů se opět píší s použitím XML. Pokud chceme použít pro zpracování nějaký styl, obecně se do XML dokumentu zařazuje odpovídající značka hned za deklaraci dokumentu.

[ukázka kódu]
<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet href="styl.xsl" type="text/xsl"?> 
...

K jednomu XML dokumentu lze připojit i více stylů.

V prostředí .NET Framework toto můžeme ipmlementovat také, nicméně zpracování stylu funguje na principu načtení XML dokumentu, načtení XSLT stylu a následně provedení transformace.

Pojďme se ale nyní podívat, jak se v praxi vytváří takový XSLT styl. Budeme stále věrní kuchařce. Kód, který transformuje vstupní XML data na HTML kód nyní vypadá takto:

[ukázka kódu]
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <head>
        <title>Kuchařka</title>
      </head>
    <body>
    <xsl:for-each select="/kucharka/recept">
      <h2><xsl:value-of select="./@nazev"/></h2>
      <ul>
        <xsl:for-each select="./ingredience">
          <li>
            <xsl:value-of select="./@nazev"/> : <xsl:value-of select="./@mnozstvi"/> x 
            <xsl:value-of select="./@jednotka"/>
          </li>
        </xsl:for-each>
      </ul>
      <p><xsl:value-of select="./postup"/></p>
    </xsl:for-each>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Vidíme zde, že je v XSLT stylech možno používat jakékoliv značky. Ty, které jsou určeny pro zpracování XSLT parserem, mají předponu xsl. Pomocí výrazů jazyka XPath si navíc jednoduše zvolíme, jaký element budeme právě potřebovat a zpracujeme jej.

Nebudu se zde rozsáhle rozepisovat o možnostech XSLT, kdo bude mít zájem o větší detaily doporučuji odkazy www.w3c.org/style/XSL a stránky Jiřího Koska XSLT v příkladech. My si osvětlíme základy používání XSLT.

6.1.1. Základy XSLT

Jako každý XML dokument, i XSLT soubor by měl kromě deklarace obsahovat i kořenový element. V případě XSLT je kořenovým elementem xsl:stylesheet. V tomto elementu se uvádí jmenný prostor, který používá XSLT, případně verze XSLT. My u XSLT budeme používat jmenný prostor http://www.w3c.org/1999/XSL/Transform.

6.1.1.1. Šablony (templates)

Základ transformace XSL tvoří šablony (templates). Ty popisují, jak se který element má měnit. Následující ukázka šablony vybere kořenový element (tedy celý dokument). Pro výběr elementů se tedy používá atribut match a jako výraz se zadá cesta k uzlu.

[ukázka kódu]
... 
<xsl:template match="/"> 
... 
</xsl:template> 
...

Do šablon je možno vkládat jiné šablony pomocí xsl:apply-templates. Pokud do tohoto příkazu jako atribut vložíme select a hodnotu elementu, který chceme zpracovat, provede se právě tento. Pokud atribut select nepoužijeme, provedou se všechny šablony, které vyhovují nalezeným elementům.

Někdy se může stát, že budeme potřebovat pro jednu šablonu více způsobů zpracování. Provádíme to pomocí tzv. módů šablony.

[ukázka kódu]
...
<xsl:apply-templates select="ingredience" mode="LI"/>
...
<xsl:template match="ingredience" mode="LI">
  <li><xsl:value-of select="@nazev"/></li>
</xsl:template>

XSL transformace se dá zapsat i bez většího použití šablon, podobně jako v úvodním příkladu. Pokud ale budeme chtít transformovat rozsáhlejší dokument, pravděpobně se bez šablon neobejdeme. S šablonami je navíc výsledný kód přehlednější.

6.1.1.2. Výběr hodnot

Příkazem pro zobrazení dat je xsl:value-of. Slouží pro získání hodnoty konkrétního elementu. V jeho atributu select se pak pomocí výrazů XPath zadá cesta k elementu. Následující příklad zjistí hodnotu atributu nazev aktuálního uzlu. Výraz atributu select lze také zapsat pouze ve tvaru @nazev.

[ukázka kódu]
... 
<xsl:value-of select="./@nazev"/> 
...
6.1.1.3. Tvorba elementů, atributů

Budeme chtít vytvořit nový element. Například chceme vytvořit odkaz na nějaké místo a jako hodnotu vzít hodnotu existujícího atributu. Dá se to provést následujícím způsobem - pomocí příkazu xsl:element vytvoříme nový element a k němu vytvoříme příkazem xsl:attribute potřebné atributy.

[ukázka kódu]
...
<xsl:element name="a">
  <xsl:attribute name="href">www.w3c.org</xsl:attribute>
  World Wide Web Consortium
</xsl:element>
...

Kód výše vytvoří následující výstup:

<a href="www.w3c.org">World Wide Web Consortium</a>
6.1.1.4. Iterativní zpracování

Uvnitř šablon lze použít příkaz xsl:for-each. U tohoto příkazu se v atributu select udává uzel, který má být zpracováván. Viz úvodní příklad - tam jsme pomocí tohoto příkazu zpracovávali jak jednotlivé recepty, tak i přísady vztahující se ke každému receptu.

6.2. Zpracování XSLT v C#

Pokud máme vytvořen XML dokument a k němu styl, který k němu chceme připojit, zpracování v C# už je velmi jednoduché. Vytvoříme si instanci třídy System.Xml.Xsl.XslTransform. Vzápětí načteme styl, kterým chceme XML dokument zpracovat a zavoláme metodu System.Xml.Xsl.XslTransform.Transform(). Jejími argumenty jsou vstupní soubor XML a výstupní soubor.

[ukázka kódu]
...
System.Xml.Xsl.XslTransform xt = new XslTransform();
xt.Load("style.xsl");

xt.Transform("kucharka.xml", "kucharka.html");
...
[příklad ke stažení]

Příklad s XSLT kompletní příklad se zdrojovým kódem, XML dokumentem kucharka.xml a dvěma styly s různým způsobem formátování naleznete zde.