Кажется, что я не могу использовать Xpath в атрибуте name элемента call-template.Как я могу обойти это?
Хороший вопрос, + 1.
Вы не можете.Но вы можете использовать вместо этого <xsl:apply-templates>
.
Вот короткая демонстрация:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:double="double" xmlns:incr="incr" xmlns:my="my:my"
exclude-result-prefixes="double incr my"
>
<xsl:output method="text"/>
<double:double/>
<incr:incr/>
<xsl:variable name="vFuncDouble"
select="document('')/*/double:*[1]"/>
<xsl:variable name="vFuncIncr"
select="document('')/*/incr:*[1]"/>
<xsl:function name="my:double">
<xsl:param name="arg1" />
<xsl:sequence select="2*$arg1"/>
</xsl:function>
<xsl:function name="my:incr">
<xsl:param name="arg1" />
<xsl:sequence select="1+$arg1"/>
</xsl:function>
<xsl:template name="double" match="double:*">
<xsl:param name="arg1"/>
<xsl:sequence select="my:double($arg1)"/>
</xsl:template>
<xsl:template name="incr" match="incr:*">
<xsl:param name="arg1"/>
<xsl:sequence select="my:incr($arg1)"/>
</xsl:template>
<xsl:function name="my:apply">
<xsl:param name="pFun" as="element()"/>
<xsl:param name="arg1"/>
<xsl:apply-templates select="$pFun">
<xsl:with-param name="arg1" select="$arg1"/>
</xsl:apply-templates>
</xsl:function>
<xsl:template match="/">
<xsl:sequence select="my:apply($vFuncIncr, my:apply($vFuncDouble,2))"/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к любому документу XML (не используется),желаемый результат получается:
5
Заметка :
В качестве параметра (первый аргумент) можно передать my:apply()
любая «функция» и my:apply()
будут применять ее ко второму аргументу .
Используя этот же принцип библиотека FXSL реализовал функции высшего порядка (HOF) в XSLT 1.0 и XSLT 2.0 - подробнее здесь .
В следующих XPath 3.0 * Функции 1045 * впервые являются первоклассными объектами в Модель данных Xpath (XDM).