5.4 Pojmenované šablony

Pojmenované šablony plní podobnou funkci jako funkce a procedury v klasických jazycích. XSLT instrukce, které se často opakují, můžeme uložit do zvláštní šablony, která se volá svým jménem. Šablona samozřejmě může používat parametry, jako všechny ostatní šablony. Pojmenovaná šablona má navíc atribut name, kterým určujeme název šablony.

<xsl:template name="název">
   tělo šablony
</xsl:template>

K vyvolání šablony slouží instrukce <xsl:call-template>. Název odpovídající šablony se opět předává v atributu name.

Příklad 5.4. Využití pojmenovaných šablon pro modularizaci stylu – paticka.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0">
  
<xsl:template match="/">
  <html>
    <head>
      <title>Testovací stránka</title>
    </head>
    <body>
      <h1>Testovací stránka</h1>
      
      <!-- Volání šablony -->
      <xsl:call-template name="paticka"/>
    </body>
  </html>  
</xsl:template>  
  
<!-- Pojmenovaná šablona, kterou budou volat jiné části stylu -->  
<xsl:template name="paticka">
  <div>
    <hr/>
    Copyright (c) 2008 Jehlička a Větvička, s.r.o.<br/>
    Lesní 13, Borová Lada<br/>
    e-mail: jehlicka-vetvicka@example.org
  </div>
</xsl:template>  

</xsl:stylesheet>

Pojmenované šabloně můžeme samozřejmě předávat i parametry. Lze tak vytvářet parametrizovatelné šablony, které nám mohou ušetřit mnoho opakující se práce.

Příklad 5.5. Pojmenované šablony s parametry – pojmenovana-sablona.xsl

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

<!-- Pojmenovaná šablona se dvěma parametry -->
<xsl:template name="kontakt">
  <xsl:param name="jmeno"/>
  <xsl:param name="email"/>
  
  <xsl:value-of select="$jmeno"/>
  <xsl:if test="$email != ''">
    <xsl:text> (e-mail: </xsl:text>
    <a href="mailto:{$email}"><xsl:value-of select="$email"/></a>
    <xsl:text>)</xsl:text>
  </xsl:if>  
</xsl:template>
  
<xsl:template match="/">
  <html>
    <head>
      <title>Kontakty</title>
    </head>
    <body>
      <h1>Kontakty na vedení firmy</h1>
      
      <p>Ředitel: 
        <xsl:call-template name="kontakt">
          <xsl:with-param name="jmeno">Jan Novák</xsl:with-param>
          <xsl:with-param name="email">novak@example.org</xsl:with-param>          
        </xsl:call-template>
      </p>
      
      <p>Skladník:
        <xsl:call-template name="kontakt">
          <xsl:with-param name="jmeno">Josef Procházka</xsl:with-param>
        </xsl:call-template>
      </p>      
    </body>
  </html>  
</xsl:template>  

</xsl:stylesheet>

Poslední příklad pak ukazuje, že pojmenované šablony mohou být použity zcela jako náhrada funkcí z klasických programovacích jazyků a v jazyce XSLT tak lze provádět například i matematické výpočty.

Příklad 5.6. Využití pojmenovaných šablon k výpočtu faktoriálu – faktorial.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

<xsl:output method="text"/>

<xsl:param name="cislo" select="5"/>

<xsl:template match="/">
  <xsl:call-template name="fakt">
    <xsl:with-param name="n" select="$cislo"/>
  </xsl:call-template>
</xsl:template>

<xsl:template name="fakt">
  <xsl:param name="n"/>
  <xsl:variable name="m">
    <xsl:if test="$n&lt;=1">
      <xsl:text>1</xsl:text>
    </xsl:if>
    <xsl:if test="$n>1">
      <xsl:call-template name="fakt">
        <xsl:with-param name="n" select="$n - 1"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:variable>
  <xsl:value-of select="$m*$n"/>
</xsl:template>

</xsl:stylesheet>

Důležitý je zde koncept zachycení výstupu pojmenované šablony do proměnné. Návratová hodnota pojmenované šablony se generuje pomocí instrukcí jako je <xsl:value-of>, které generují přímo výstup skriptu. Pokud však volání pojmenované šablony umístíme dovnitř instrukce <xsl:variable>, nezapíše se výsledek pojmenované šablony přímo na výstup, ale uloží se do proměnné a my s ním můžeme dál pracovat.

U pojmenované šablony můžeme použít i atribut match. Šablona pak může být použita oběma způsoby – buď je vyvolána procesorem pro obsluhu určité části dokumentu, nebo je přímo zavolána pomocí <xsl:call-template>.

© Jiří Kosek 2007

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-2011 Jiří Kosek