2011-02-07 147 views
2

只是试图创建和使用显示该节点的内容(如果有的话)或一个破折号如果为空的XSL函数。错误声明和使用函数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,]). 

一些想法?

+0

问得好,+1。查看我的答案,找出问题的最可能原因。 :) –

回答

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> 
+0

你对!我正在使用AXIS 1! 用于在XSLT 1.0中创建函数的任何解决方案? –

+0

@ Patrick-Ferreira:在XSLT1.0中,对任何命名模板使用''。 –

+0

@ Patrick-Ferreira:我已经更新了我的答案,以说明如何在XSLT 1.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> 
+0

+1很好的答案。所引用函数的签名与所定义函数的签名不匹配。 – LarsH

+0

感谢您的快速回复。我已经尝试过了,但是我遇到了同样的问题:( –

+0

函数体中没有上下文节点,所以'self :: node()'的''''缩写会产生一个错误。 – 2011-02-07 16:41:59

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> 

输出

- 

关于你的函数:你只带区空格字符...

+0

较短:'(。[normalize-space()],' - ')[1]' – 2011-02-07 17:06:32