xslt:2参数函数无法识别

时间:2018-09-23 10:23:59

标签: xml function xslt

在以下XSLT代码段中

<?xml version="1.0" ?>
<xsl:stylesheet version="2.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:my="bla">

    <xsl:template match="/">
       <xsl:value-of select="my:add(4,2)"/>
    </xsl:template>

    <xsl:function name="my:add" as="xs:integer">
        <xs:param name="n" as="xs:integer"/>
        <xs:param name="k" as="xs:integer"/>
        <xsl:value-of select="$n + $k"/>
    </xsl:function>

</xsl:stylesheet>

我收到以下错误:

Static error in {my:add(4,2)} in expression in xsl:value-of/@select on line 9 column 40 of john.xsl:
  XPST0017: Cannot find a 2-argument function named {bla}add(). The namespace URI and local
  name are recognized, but the number of arguments is wrong
Static error at char 3 in xsl:value-of/@select on line 30 column 37 of john.xsl:
  XPST0008: Variable n has not been declared (or its declaration is not in scope)
Errors were reported during stylesheet compilation

我知道我可以使用<xsl:function name="my:add" as="xs:integer*">作为函数头,但是我不想这样。我找不到这有什么问题,因为我找到了几个类似的例子。

1 个答案:

答案 0 :(得分:2)

函数参数在Schema名称空间中。它们必须位于XSLT命名空间中。

没有任何xsl:param,它是一个零Arity函数,其中包含Schema名称空间中的两个param元素。

  

[定义:样式表函数的 arity 是函数定义中xsl:param元素的数量。]不允许使用可选参数。

xs元素xsl上,将名称空间前缀从param更改为xsl:param

此外,由于您的函数返回整数,因此请使用xsl:sequence而不是xsl:value-ofxsl:value-of将根据数字结果生成一个字符串,然后将其转换为xs:integer。只需按原样返回数字乘积即可。

<?xml version="1.0" ?>
<xsl:stylesheet version="2.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:my="bla">

    <xsl:template match="/">
       <xsl:value-of select="my:add(4,2)"/>
    </xsl:template>

    <xsl:function name="my:add" as="xs:integer">
        <xsl:param name="n" as="xs:integer"/>
        <xsl:param name="k" as="xs:integer"/>
        <xsl:sequence select="$n + $k"/>
    </xsl:function>

</xsl:stylesheet>