XSLT 2.0はxsl:functionで2乗を求める関数を次のように書くことができます.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ahf="urn:ahf" exclude-result-prefixes="xs"
    version="2.0">
    <xsl:function name="ahf:powerOf2" as="xs:integer">
        <xsl:param name="prmX" as="xs:integer"/>
        <xsl:sequence select="$prmX * $prmX"/>
    </xsl:function>
    <xsl:template match="/">
        <xsl:variable name="x" as="xs:integer" select="3"/>
        <!-- ここでxの2乗を求め、xの値、結果の値をxsl:messageで表示します-->
        <xsl:message select="'x=', $x, ' xの2乗=', ahf:powerOf2($x)"/>
    </xsl:template>
</xsl:stylesheet>

これはXSLT 3.0ではインラインの無名関数を使って次のように書くことができます.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ahf="urn:ahf" exclude-result-prefixes="xs"
    version="3.0">
    <xsl:variable name="powerOf2" as="function(*)" select="function($x as xs:integer) as xs:integer {$x * $x}"/>
    <xsl:template match="/">
        <xsl:variable name="x" as="xs:integer" select="3"/>
        <!-- ここでxの2乗を求め、xの値、結果の値をxsl:messageで表示します-->
        <xsl:message select="'x=', $x, ' xの2乗=', $powerOf2($x)"/>
    </xsl:template>
</xsl:stylesheet>

xのy乗を求めるような次の例では再帰を使用します.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ahf="urn:ahf" exclude-result-prefixes="xs"
    version="2.0">
    <xsl:function name="ahf:powerOfY" as="xs:integer">
        <xsl:param name="prmX" as="xs:integer"/>
        <xsl:param name="prmY" as="xs:integer"/>
        <xsl:choose>
            <xsl:when test="0 lt $prmY -1">
                <xsl:sequence select="$prmX * ahf:powerOfY($prmX, $prmY - 1)"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:sequence select="$prmX"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:function>
    <xsl:template match="/">
        <xsl:variable name="x" as="xs:integer" select="3"/>
        <xsl:variable name="y" as="xs:integer" select="5"/>
        <!-- ここでxのy乗を求め、xの値、yの値、結果の値をxsl:messageで表示します-->
        <xsl:message select="'x=', $x, ' y=', $y, 'xのy乗=', ahf:powerOfY($x,$y)"/>
    </xsl:template>
</xsl:stylesheet>

ではこのxのy乗を求める関数をインラインで書くにはどうしたらできるのでしょうか?無名関数なので、自分自身に再帰することはできるのでしょうか?

よろしくお願いします.