【发布时间】:2011-04-08 09:54:54
【问题描述】:
我正在使用 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)
现在这很奇怪!为什么 Xalan 会在 java.lang.String 上寻找 stringLength 函数?我测试了<xsl:value-of select="fn:substring('foobar', 2, 3)"/>,确实:结果是o,所以参数被用作startIndex, endIndex(如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 function substring (string, startIndex, length) 而不是我在过期时看到的 (string, startIndex, endIndex) 函数吗?这个startIndex、endIndex函数看起来像java.lang.String的substring方法是不是巧合?
为什么我在使用fn:string-length 函数时会收到 NoSuchMethodError?
这里出了点问题,显然不是关于 XPath 1.0 与 2.0...
【问题讨论】:
-
好问题 (+1)。请参阅我的答案以获得解释。
-
您为前缀 fn: 使用什么命名空间?当您使用
<xsl:value-of select="string-length('foobar')"/>(即string-length()上没有命名空间前缀)时,它是否仍然给出NoSuchMethodException? -
LarsH: 命名空间是w3.org/2005/02/xpath-functions,但正如 Alejandro 在下面写的,我必须省略 fn: 前缀。谢谢!
-
@Jens-Bannmann、@LarsH、@Alejandro、@Mads-Hansen:有人对@Mads-Hansen 和我的答案投了反对票——这两个答案都是正确的?!?让我们至少解释一下投票失败的原因。如果 OP 一夜之间在他最初的问题中添加了新问题,我们应该醒来发现我们的正确答案被否决了吗?
-
@Dimitre:+1 唤醒评论!奇怪的事情发生在 SO... 至少我们将 XSL 标记保持为 XSLT 标记的同义词。