V XSLT 2.0 si můžeme pomocí nové instrukce
<xsl:function>
definovat nové funkce, které pak
můžeme volat přímo z výrazu XPath. U funkce můžeme pomocí atributu
as
určit typ její návratové
hodnoty. Podobně můžeme typy určit i pro jednotlivé parametry. Můžeme
tak XSLT 2.0 používat jako silně typový jazyk, kde se při volání
funkce kontrolují typy předávaných hodnot.
Funkce musí být definována v nějakém jmenném prostoru. Návratová
hodnota funkce se většinou určuje pomocí instrukce
<xsl:sequence>
. Tato nová instrukce může vracet
libovolnou posloupnost (reflektuje tedy nový datový typ XPathu 2.0) –
tato posloupnost může obsahovat jak hodnoty, tak uzly. Není problém
mít posloupnost, která má jen jednu hodnotu. Výhodou této instrukce je
právě to, že může vracet otypované hodnoty nebo uzly původního
dokumentu. Pokud jsme funkce simulovali v XSLT 1.0 pomocí
pojmenovaných šablon, výsledkem byl vždy nový fragment výstupního
dokumentu.
Příklad 14.7. Definice uživatelských funkcí v XSLT 2.0 –
faktorial3.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:muj="http://example.com/muj" version="2.0"> <xsl:output method="text"/> <xsl:param name="cislo" select="5" as="xs:integer"/> <xsl:template match="/"> <xsl:value-of select="muj:faktorial($cislo)"/> <xsl:text>
</xsl:text> </xsl:template> <xsl:function name="muj:faktorial" as="xs:integer"> <xsl:param name="n" as="xs:integer"/> <xsl:choose> <xsl:when test="$n > 1"> <xsl:sequence select="$n * muj:faktorial($n - 1)"/> </xsl:when> <xsl:otherwise> <xsl:sequence select="1"/> </xsl:otherwise> </xsl:choose> </xsl:function> </xsl:stylesheet>