在xsl上声明和使用函数时出错

时间:2011-02-07 16:09:03

标签: templates function xslt xslt-2.0

只是尝试创建和使用XSL函数,该函数显示节点的内容(如果有)或短划线(如果为空)。

以下是该文件的一些部分:

<xsl:stylesheet version="2.0" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  xmlns:qes="http://www.qwamci.com">

  <xsl:function name="qes:textOrDash" as="xs:string">
    <xsl:param name="mynode" />
    <xsl:sequence select="if (fn:compare(translate($mynode, ' ', ''), '')=0) then '-' else $mynode" />
  </xsl:function>

  <xsl:template match="Response">
    <xsl:value-of select="qes:textOrDash(./SOME/OTHER/XPATH/TO/NODE)" />
  </xsl:template>

</xsl:stylesheet>

错误:

Erreur:java.lang.NoSuchMethodException: For extension function, could not find method org.apache.xml.utils.NodeVector.textOrDash([ExpressionContext,] ).

有些想法?

3 个答案:

答案 0 :(得分:1)

您需要为您的函数定义一些参数。您已经定义了一个函数qes:textOrDash(),您需要将<xsl:param name="input"/>添加到您的函数定义中,然后引用$input而不是.,这样您就可以:

<xsl:function name="qes:textOrDash" as="xs:string">
  <xsl:param name="input" />
  <xsl:sequence select="if (fn:compare(translate($input, ' ', ''), '')=0) then '-' else ." />
</xsl:function>

答案 1 :(得分:1)

首先,我不认为你需要一个功能。例如,这个样式表:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="test">
        <xsl:value-of select="(.,'-')[normalize-space(.)][1]"/>
    </xsl:template>
</xsl:stylesheet>

使用此输入:

<test>string</test>

输出:

string

使用此输入:

<test></test>

输出:

-

使用此输入:

<test><not-string-value/></test>

输出:

-

这个输入:

<test>&#x20;&#xA;&#x9;&#xD;</test>

输出

-

关于你的功能:你只是在划分太空角色...

答案 2 :(得分:0)

您似乎正在尝试使用XSLT 1.0处理器执行XSLT 2.0转换

在XSLT 1.0中没有<xsl:function>指令,但可以使用模板:

<xsl:call-template name="textOrDash">
 <xsl:with-param name="mynode" select="SomeXPath-Expression"/>
</xsl:call-template>

<xsl:template name="textOrDash">
 <xsl:param name="mynode" select="someDefault"/>

<!-- Processing here -->
</xsl:template>