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.

14.8 Další novinky

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

© 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