Šablony

Základem každého stylu jsou šablony. Jejich základní tvar je:

<xsl:template match="výraz">
   tělo šablony
</xsl:template>

Tělo šablony přitom přesně definuje, jak se části transformovaného dokumentu vyhovující výrazu budou zpracovávat. V těle šablony můžeme používat další konstrukce XSLT nebo přímo elementy z výsledného dokumentu – nejčastěji tedy HTML tagy, protože generujeme HTML kód.

Mezi dva nejpoužívanější příkazy, které se používají uvnitř šablony, patří value-of a apply-templates. Abychom pochopili k čemu se mají používat a jaký je mezi rozdíl, musíme nejprve vědět, v jakém pořadí se zpracovávají jednotlivé šablony.

XSLT procesor na začátku své práce načte do paměti vstupní XML dokument a vytvoří si jeho stromovou reprezentaci (obrázek 3). Tento strom je pak postupně procházen od kořene v pořadí v jakém jsou elementy obsaženy v dokumentu (jedná se tedy o průchod do hloubky). V okamžiku, kdy je nalezena šablona odpovídající uzlu ve stromu, začne se její obsah zapisovat na výstup. Důležité je, že další potomci uzlu, pro který byla vybrána šablona, už nejsou dál automaticky zpracováváni. Pokud tak chceme učinit, musíme uvnitř šablony použít instrukci <xsl:apply-templates/>. Ta říká, že se má daná větev stromu zpracovávat dále a mají se pro její uzly hledat odpovídající šablony.

Pokud chceme v těle šablony použít jen textový obsah nějakého elementu a jeho podelementů, ale nechceme aplikovat další šablony, hodí se instrukce <xsl:value-of select="výraz"/>. Ta vybere pouze obsah textových uzlů, které jsou potomky elementu určeného pomocí výrazu (ten je opět zapsán pomocí syntaxe XPath).

V některých případech je jedno, kterou možnost použijeme. Budeme-li chtít, aby se název firmy na faktuře zobrazoval tučně (HTML tag <b>), máme dvě možnosti, jak toho dosáhnout.

<xsl:template match="nazev">
  <b><xsl:value-of select="."/></b>
</xsl:template>

<xsl:template match="nazev">
  <b><xsl:apply-templates/></b>
</xsl:template>

Pokud však potřebujeme zpracovávat složitější a vnořené struktury, je většinou přehlednější, když použijeme opakované aplikování šablon. Oba dva přístupy jsou ilustrovány v příkladě 1.

Příklad 1. Styl pro převod XML faktury do formátu HTML

<?xml version="1.0" encoding="windows-1250"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		version="1.0">

<xsl:template match="/">
  <html>
    <head>
      <title>Faktura │■slo: <xsl:value-of select="faktura/@cislo"/></title>
    </head>
    <body>
      <table border="1" width="100%">
        <tr valign="top">
          <td rowspan="4">
            <xsl:apply-templates select="faktura/dodavatel"/>
          </td>
	  <td align="right">
            <xsl:value-of select="faktura/@cislo"/>
          </td>
        </tr>
        <tr valign="top">
          <td>
            <xsl:apply-templates select="faktura/odberatel"/>
          </td>
        </tr>
        <tr valign="top">
          <td>Datum vystaven■: 
            <xsl:value-of select="faktura/@vystaveni"/>
          </td>
        </tr>
        <tr valign="top">
          <td>Datum splatnosti: 
            <xsl:value-of select="faktura/@splatnost"/>
          </td>
        </tr>
        <tr>
	  <td colspan="2">
	    <table border="0" width="100%">
	      <xsl:apply-templates select="faktura/polozka"/>
	    </table>
          </td>
        </tr>
      </table>
    </body>
  </html>
</xsl:template>

<xsl:template match="dodavatel">
  <p><b><i>Dodavatel:</i></b></p>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="odberatel">
  <b><i>Odb↓ratel:</i></b><br/>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="nazev">
  <b><xsl:apply-templates/></b><br/>
</xsl:template>

<xsl:template match="adresa">
  <xsl:apply-templates/><br/>
</xsl:template>

<xsl:template match="ico">
  I￈O: <xsl:apply-templates/><br/>
</xsl:template>

<xsl:template match="dic">
  DI￈: <xsl:apply-templates/><br/>
</xsl:template>

<xsl:template match="polozka">
  <tr>
    <td>
      <xsl:value-of select="popis"/>
    </td>
    <td align="right">
      DPH <xsl:value-of select="dph"/>
    </td>
    <td align="right">
      <xsl:value-of select="cena"/>
      <xsl:text> </xsl:text>
      <xsl:value-of select="cena/@mena"/>
    </td>
  </tr>
</xsl:template>

</xsl:stylesheet>

Obrázek 4. Výsledek aplikování stylu v prohlížeči

© Jiří Kosek 2000-2001