我正在使用 Xalan 2.7.0(与 Apache FOP 1.0 捆绑在一起)并且在使用字符串函数时遇到问题。
该行<xsl:value-of select="fn:replace('test', 't', '*')"/>
导致此异常:
javax.xml.transform.TransformerException: java.lang.IllegalArgumentException: argument type mismatch
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
<xsl:value-of select="fn:string-length('foobar')"/>
结果是:
javax.xml.transform.TransformerException: java.lang.NoSuchMethodException: For extension function, could not find method java.lang.String.stringLength([ExpressionContext,] ).
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
现在这很奇怪!为什么 XalanstringLength
在 上寻找函数java.lang.String
?我测试<xsl:value-of select="fn:substring('foobar', 2, 3)"/>
了 ,确实:结果是o
,所以参数被用作startIndex, endIndex
(like java.lang.String.substring()
) 而不是 XPath 的函数fn:substring(string, start, length)
。
所以我认为 Xalan 不知何故缺少它的 XPath 函数库,而是使用常规的 String 类。我通过调用不存在的函数来确认这一点,该函数fn:index-of('foobar', 'bar')
可以正常工作并映射到java.lang.String.indexOf(str)
.
为什么 Xalan 会这样做?我该如何解决?
系统信息:Xalan 使用标准的 Mac OS X 10.6.4 Java 版本,1.6.0_20。
更新
好的,暂时先搁置该replace()
功能。作为 XSLT 1.0 处理器的 Xalan 不应该实现XPath 1.0 函数子字符串 (string, startIndex, length)
而不是(string, startIndex, endIndex)
我在过期时看到的函数吗?这个 startIndex、endIndex 函数看起来像 的 substring 方法是巧合java.lang.String
吗?
为什么我在使用该fn:string-length
函数时会收到 NoSuchMethodError?
这里出了点问题,显然与 XPath 1.0 与 2.0 无关……