只是尝试创建和使用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)
您需要为您的函数定义一些参数。您已经定义了一个函数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> 
	
</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>