Function Xalan 2.7中缺少字符串函数,是否改用java.lang.String?
我使用的是Xalan 2.7.0(与ApacheFop1.0捆绑在一起),在使用字符串函数时遇到问题 行Function Xalan 2.7中缺少字符串函数,是否改用java.lang.String?,function,xpath,xalan,xslt,Function,Xpath,Xalan,Xslt,我使用的是Xalan 2.7.0(与ApacheFop1.0捆绑在一起),在使用字符串函数时遇到问题 行导致此异常: javax.xml.transform.TransformerException: java.lang.IllegalArgumentException: argument type mismatch at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302) 会导致: javax.xml.
导致此异常:
javax.xml.transform.TransformerException: java.lang.IllegalArgumentException: argument type mismatch
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
会导致:
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
函数?我测试了
,结果确实是o
,因此参数被用作startIndex,endIndex
(比如java.lang.String.substring()
),而不是XPath的fn:substring(String,start,length)
函数
因此,我认为Xalan在某种程度上缺少了XPath函数库,而是使用了常规字符串类。我通过调用不存在的函数fn:index of('foobar','bar')
确认了这一点,该函数运行良好,并映射到java.lang.String.indexOf(str)
Xalan为什么这么做?我怎样才能修好它
系统信息:Xalan使用标准Mac OS X 10.6.4 Java版本1.6.0_20
更新
好的,暂时搁置replace()
函数。作为XSLT1.0处理器的Xalan不应该实现(string,startIndex,length)
而不是我在expirements中看到的(string,startIndex,endIndex)
函数吗?这个startIndex,endIndex函数看起来像java.lang.String
的子字符串方法,这是巧合吗
为什么在使用fn:string length
函数时会出现NoSuchMethodError
这里出了点问题,显然不是XPath 1.0对2.0的问题。replace()
是一个XSLT2.0函数Xalan是一种XSLT1.0处理器
可以使用以下命令模拟replace()函数:
请记住,这个XSLT1.0解决方案是一个非常简单的查找/替换。XSLT 2.0函数replace()可以对“find”表达式使用正则表达式模式。子字符串('foobar',2,3)(注意:没有命名空间的)的结果应该是
oob
在XSLT1.0中,任何带有前缀的函数调用都将被解释为扩展调用。从
如果在FunctionCall中输入FunctionName
表达式不是NCName(即如果
它包含一个冒号),则为
视为对分机的调用
功能。函数名已展开
使用命名空间创建一个名称
评价报告的声明
上下文
这太奇怪了!为什么Xalan看起来像
对于上的stringLength函数
java.lang.String?我测试了
,事实上:结果是o,所以
这些参数被用作startIndex,
endIndex(如
而不是java.lang.String.substring()
XPath的fn:substring(string,start,
长度)函数
所以我认为Xalan在某种程度上
缺少其XPath函数库和
使用常规字符串类
相反我打电话确认了这一点
不存在的功能
fn:foobar和bar的索引
工作良好,并映射到
java.lang.String.indexOf(str)
Xalan为什么这么做?我该怎么办
修好它
,在XSLT1.0中进行简单的替换当旧Xalan是唯一的选择时,这一个对我来说很有用:
<xsl:value-of
select="java:replaceAll(java:java.lang.String.new(ContactInfo/telephone/text()),'[^0-9]','')"/>
好问题(+1)。请参阅我的答案以了解解释。您使用什么名称空间作为前缀fn:?当您使用
(即string-length()
上没有名称空间前缀)时,它是否仍然会给出NoSuchMethodException?LarsH:名称空间是,但正如Alejandro在下面所写,我必须省略fn:前缀。谢谢@延斯·班曼、@LarsH、@Alejandro、@Mads-Hansen:有人否决了@Mads-Hansen和我的答案——哪两个都是正确的?!?让我们至少解释一下投票的原因。如果OP一夜之间在最初的问题中添加了新的问题,我们是否应该醒过来,找到被否决的正确答案?@Dimitre:+1作为醒过来的评论!奇怪的事情发生在如此。。。至少我们把XSL标记保持为XSLT标记的同义词。
<xsl:value-of
select="java:replaceAll(java:java.lang.String.new(ContactInfo/telephone/text()),'[^0-9]','')"/>