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.
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>
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>
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>
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-->
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.