http://exslt.org/functions
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>
</xsl:text> </xsl:template> <func:function name="muj:faktorial"> <xsl:param name="n"/> <xsl:variable name="m"> <xsl:if test="$n<=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>
</xsl:text> </xsl:template> </xsl:stylesheet>