Potřebujete pomoci s XSLT?
Nabízím školení, konzultace, vývoj XSLT kódu na zakázku. Nevájte a kontaktujte mne.

Podpořte provoz stránek
Platba probíhá pomocí služby PayPal a je možné platit kartou nebo převodem z vašeho PayPal účtu.

3.2 Vytváření výstupního dokumentu

3.2.1. Generování elementů a textového výstupu
3.2.2. Generování elementů a atributů s předem neznámým názvem
3.2.3. Opakované vkládání skupiny atributů
3.2.4. Generování komentářů – <xsl:comment>
3.2.5. Generování instrukcí pro zpracování – <xsl:processing-instruction>

Cílem každé transformace je vytvořit nějaký výstupní dokument. XSLT nabízí hned několik způsobů, jak generovat jednotlivé části výstupu.

3.2.1 Generování elementů a textového výstupu

Všechny elementy, které jsou obsažené v šablonách a nepatří do jmenného prostoru XSLT (nejčastěji prefix xsl), jsou včetně všeho textu kopírovány do výstupního dokumentu.

Pokud chceme generovat nějaké texty na základě XPath výrazů, použijeme instrukci <xsl:value-of>:

<xsl:value-of select="výraz"/>

Jako hodnotu výrazu můžeme použít libovolný XPath výraz používající všechny dostupné funkce. Před vložením výsledku do dokumentu, se výsledek vždy převede na textový řetězec.

Instrukci <xsl:value-of/> lze použít jen uvnitř obsahu nějakého elementu – nemůžeme ji použít například uvnitř atributu.

Pokud chceme výsledek nějakého výrazu vložit do atributu, který se generuje na výstup, můžeme výraz uzavřít do složených závorek, a použít ho v hodnotě atributu. Takto vypočítanou hodnotu lze použít ve všech atributech výstupního dokumentu a ve velmi omezeném množství XSLT atributů.

Příklad:

<a name="{generate-id(.)}"></a>

XPath výrazu zapisovanému do hodnoty atributu se v anglicky psaných textech často říká AVT (attribute value template).

Pokud do hodnoty atributu potřebujeme vložit samotný znak levé nebo pravé složené závorky, musíme ho zdvojit ({{, }}).

Pokud generovaný text vkládáme přímo do stylu, může obsahovat nechtěné bílé znaky (mezery, tabelátory, konce řádků apod.). Pokud tomu chceme zamezit, můžeme použít speciální instrukci <xsl:text>. Jako její obsah lze použít již jen text (žádné vnořené elementy nebo XSLT instrukce). Zapsaný text se beze změn zkopíruje do výstupního dokumentu.

<xsl:text>Nějaký text</xsl:text>

3.2.2 Generování elementů a atributů s předem neznámým názvem

Dříve popsané metody umožňovaly generovat pouze obsah elementů a atributů, pokud však potřebujeme ve stylu dynamicky určit i název elementu nebo atributu, musíme použít speciální instrukce XSLT procesoru.

Pro generování elementu máme k dispozici instrukci <xsl:element>. Pomocí atributu name, můžeme určit jméno elementu. Atribut přitom může obsahovat XPath výrazy uzavřené do složených závorek. Pokud chceme vytvořit element, který patří do nějakého jmenného prostou, můžeme URI jmenného prostoru určit pomocí atributu namespace.

Jako obsah elementu se pak použije text nebo další XSLT instrukce, které vygenerují obsah elementu.

Následující kus XSLT:

<xsl:element name="{concat('e', 'm')}">
  Ahoj
</xsl:element>

vygeneruje tento výsledný fragment dokumentu:

<em>Ahoj</em>

Zcela obdobným způsobem lze generovat i atributy. Slouží k tomu, poněkud nečekaně, instrukce <xsl:attribute>. Opět můžeme určit jméno atributu a případně i URI jmenného prostoru. Jako obsah elementu se pak uvádí budoucí hodnota atributu.

Tuto instrukci musíme uvádět bezprostředně za počátečním tagem elementu nebo instrukce <xsl:element>, nesmí před ní předcházet žádný obsah elementu.

<xsl:element name="{concat('e', 'm')}">
  <xsl:attribute name="role">bold</xsl:attribute>
  Ahoj
</xsl:element>

<em role="bold">Ahoj</em>

3.2.3 Opakované vkládání skupiny atributů

Pokud potřebujeme stejnou skupinu atributů opakovaně vkládat na různá místa výstupního dokumentu, můžeme s výhodou využít instrukci <xsl:attribute-set>. Ta nám umožňuje vytvoření a pojmenování celé množiny atributů.

<xsl:attribute-set name="nadpis">
  <xsl:attribute name="align">center</xsl:attribute>
  <xsl:attribute name="class">heading</xsl:attribute>
  <xsl:attribute name="style">color: blue</xsl:attribute>
</xsl:attribute-set>

Pomocí atributu xsl:use-attribute-sets pak můžeme takovou množinu připojit k libovolnému elementu. Např.:

<h1 xsl:use-attribute-sets="nadpis">Úvod</h1>

Nám na výstupu vygeneruje:

<h1 align="center" class="heading" style="color: blue">Úvod</h1>

Atribut use-attribute-sets můžeme používat u i některých elementů XSLT jako <xsl:element>, <xsl:copy> a dokonce i u deklarace jiné množiny atributů <xsl:attribute-set>. Hodnotou use-attribute-sets může být i více hodnot oddělených mezerou, a použijí se pak atributy z více množin.

Množina atributů se vyhodnocuje při každém jejím použití, takže lze používat podmínky. Aktuální uzel se nemění. Např.:

<xsl:attribute-set name="nadpis">
  <xsl:attribute name="align">center</xsl:attribute>
  <xsl:attribute name="class">
    <xsl:choose>
      <xsl:when test="self::section">heading</xsl:when>
      <xsl:when test="self::subsection">subheading</xsl:when>
      <xsl:otherwise>unknown</xsl:otherwise>
    </xsl:choose>
  </xsl:attribute>
  <xsl:attribute name="style">color: blue</xsl:attribute>
</xsl:attribute-set>

3.2.4 Generování komentářů – <xsl:comment>

Pokud chceme do výstupu automaticky vygenerovat komentář, není nic snazšího.

<xsl:comment>Automaticky vygenerováno pomocí XSLT</xsl:comment>

<!--Automaticky vygenerováno pomocí XSLT-->

3.2.5 Generování instrukcí pro zpracování – <xsl:processing-instruction>

Velice jednoduše se dají generovat i instrukce pro zpracování. U nich ještě musíme určit název cíle pomocí atributu name.

<xsl:processing-instruction name="php">
  echo Date("d.m.Y H:i:s")
</xsl:processing-instruction>

<?php
  echo Date("d.m.Y H:i:s")
?>

Ukázka generování komentářů a instrukcí pro zpracování je ve stylu katalog-komentar-pi.xsl.

Syntaxe instrukcí pro zpracování se pro jazyky HTML (které vychází z SGML) a XML liší. V závislosti na výstupní metodě je instrukce ukončena buď znakem ‚>‘ nebo znaky ‚?>‘. Budeme-li tak chtít instrukce pro PHP vkládat při použití výstupní metody pro HTML, musíme před ukončovací tag instrukce </xsl:processing-instruction> ručně dopsat otazník.

© Jiří Kosek 2014

Tento dokument je určen výhradně pro osobní potřebu seznámení s jazykem XSLT. Jakékoliv jiné použití, včetně dalšího šíření, pořizování kopií, použití při školeních a výuce apod. je výslovně zakázáno a bude považováno za porušení autorských práv.


Copyright © 2000-2014 Jiří Kosek