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.

13.5 Elementy pro definování funkcí

Jmenný prostor

http://exslt.org/functions

Typický prefix

func

V XSLT můžeme obdobu funkcí vytvářet pomocí pojmenovaných šablon s případnými parametry. Má to však dvě nevýhody – volání funkce je nepohodlné (využívá se <call-template>) a pojmenovaná šablona vrací je fragment výstupního dokument, nelze vracet základní skalární typy nebo seznam uzlů. EXSLT proto definuje dvě nové instrukce, které umožňují z pojmenované šablony udělat funkci.

Jediný rozdíl je v tom, že místo <xsl:template> použijme <func:function> a návratovou hodnotu funkce předáme pomocí <func:result>. Nově definovanou funkci pak můžeme používat v XPath výrazech jako běžnou funkci. Následující ukázka ilustruje použití nových rozšiřujících elementů na funkci pro výpočet faktoriálu.

Příklad 13.10. Definice vlastní funkce – faktorial2.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0"
                xmlns:func="http://exslt.org/functions"
                xmlns:muj="http://example.com/muj"
                extension-element-prefixes="func">

<xsl:output method="text"/>

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

<xsl:template match="/">
  <xsl:value-of select="muj:faktorial($cislo)"/>
  <xsl:text>&#xA;</xsl:text>
</xsl:template>

<func:function name="muj:faktorial">
  <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:value-of select="muj:faktorial($n - 1)"/>
   </xsl:if>
  </xsl:variable>
  <func:result select="$m*$n"/>
</func:function>

</xsl:stylesheet>

Zatím jsme se nezmínili o jedné užitečné věci, kterou XSLT nabízí. Pokud umístíme jako dítě kořenového elementu stylu element v nějakém neznámém jmenném prostoru, XSLT procesory jej ignorují. Můžeme ho proto použít pro uložení různých pomocných informací a pomocí funkce document() tyto informace využívat ve stylu. Vše demonstruje následující příklad, který slouží pro výpis data podle českých zvyklostí.

Příklad 13.11. Vypsání data v češtině – datum-cs.xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0"
                xmlns:date="http://exslt.org/dates-and-times"
                xmlns:func="http://exslt.org/functions"
                xmlns:m="urn:x-kosek:locale:cs:mesice"
                xmlns:datum="urn:x-kosek:xslt:datum"
                extension-element-prefixes="date func datum">

<xsl:output method="text" encoding="cp852"/>

<!-- Tabulka s českými názvy měsíců -->
<m:mesice>
  <nazev>ledna</nazev>
  <nazev>února</nazev>
  <nazev>března</nazev>
  <nazev>dubna</nazev>
  <nazev>května</nazev>
  <nazev>června</nazev>
  <nazev>července</nazev>
  <nazev>srpna</nazev>
  <nazev>září</nazev>
  <nazev>října</nazev>
  <nazev>listopadu</nazev>
  <nazev>prosince</nazev>
</m:mesice>

<!-- Funkce, která vrací český název měsíce -->
<func:function name="datum:month-name">
  <xsl:param name="datum" select="date:date-time()"/>
  <func:result select="document('')/*/m:mesice/nazev[position() = date:month-in-year($datum)]"/>
</func:function>

<!-- Šablona, která demonstruje použití nové funkce -->
<xsl:template match="/">
  <xsl:text>Generováno </xsl:text>
  <xsl:value-of select="concat(date:day-in-month(), '. ', 
                        datum:month-name(), ' ', date:year())"/>
  <xsl:text>&#xA;</xsl:text>
</xsl:template>
  
</xsl:stylesheet>

© 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