XSLT 2.0 nabízí i pár dalších drobností, které nám mohou
zpříjemnit práci. Jendou z nich je možnost definovat výchozí jmenný
prostor pro všechny výrazy zapsané v XPathu. Při zpracování dokumentu,
který má hodně elementů v jednom jmenném prostoru pak ušetříme
opakovaný zápis prefixů. Výchozí jmenný prostor pro XPath definujeme
pomocí atributu xpath-default-namespace
u <xsl:stylesheet>
.
Složitější styly lze nyní občas zjednodušit pomocí nové
instrukce <xsl:next-match>
. Ta zavolá pro
zpracování aktuálního uzlu další šablonu, která má nižší prioritu než
ta aktuálně prováděná. Chování je tedy podobné jakou
<xsl:apply-imports>
, ale nejvhodnější šablona se
hledá mezi všemi šablonami, ne jen mezi těmi, které byly naimportovány
a mají tudíž nižší importní prioritu.
Příklad 14.12. Ukázka dalších konstrukcí XSLT 2.0 –
addmenu3.xsl
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" version="2.0"> <!-- Výstupem je XHTML Strict --> <xsl:output method="xhtml" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/> <!-- Standardně se všechny uzly kopírují --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- Vložení stylu do záhlaví --> <xsl:template match="head"> <!-- Zkopírování atributů --> <xsl:copy> <xsl:apply-templates select="@*"/> <!-- Informace o kódování --> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <!-- Zkopírování původního obsahu elementu head --> <xsl:apply-templates select="node()"/> <!-- Vložení stylu --> <style type="text/css"> .menu { position: fixed; left: 10px; width: 182px; border: 2px blue solid; padding: 2px; overflow: auto; height: 90%; /* IE hack */ position: expression("absolute"); top: expression(document.body.scrollTop+this.offsetHeight-this.offsetHeight); } .content { margin-left: 200px } </style> </xsl:copy> </xsl:template> <!-- Odstranění původní informace o kódování --> <xsl:template match="meta[lower-case(@http-equiv)='content-type']"/> <!-- Hned za HTML se vloží menu --> <xsl:template match="body"> <!-- Kopie elementu body --> <xsl:copy> <!-- Zkopírování všech atributů --> <xsl:apply-templates select="@*"/> <!-- Vytvoření menu --> <div class="menu"> <xsl:apply-templates mode="toc"/> </div> <!-- Původní obsah stránky --> <div class="content"> <xsl:apply-templates select="node()"/> </div> </xsl:copy> </xsl:template> <!-- Položka obsahu z nadpisů --> <xsl:template match="h1|h2|h3" mode="toc" priority="2"> <!-- Zavolání další vhodné šablony, která se postará o odsazení --> <xsl:next-match/> <!-- Vygenerování odkazu do těla dokumentu --> <a href="#{if (@id) then @id else generate-id()}"> <xsl:value-of select="."/> </a> <br/> </xsl:template> <!-- Odsazení jednotlivých úrovní nadpisů v obsahu --> <xsl:template match="h1" mode="toc"/> <xsl:template match="h2" mode="toc">-</xsl:template> <xsl:template match="h3" mode="toc">--</xsl:template> <!-- V režimu tvorby obsahu nás zajímají jen nadpisy, ostatní text ignorujeme --> <xsl:template match="text()" mode="toc"/> <!-- Doplnění identifikátorů pro odkazy --> <xsl:template match="h1[not(@id)] | h2[not(@id)] | h3[not(@id)]"> <xsl:copy> <!-- Zkopírování všech atributů --> <xsl:apply-templates select="@*"/> <!-- Doplnění ID --> <xsl:attribute name="id"><xsl:value-of select="generate-id()"/></xsl:attribute> <!-- Zkopírování původního obsahu elementu --> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Podrobný popis všech konstrukcí XSLT 2.0 naleznete buď v jeho specifikaci nebo ve výborné knize [6].