Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function Xalan 2.7中缺少字符串函数,是否改用java.lang.String?_Function_Xpath_Xalan_Xslt - Fatal编程技术网

Function Xalan 2.7中缺少字符串函数,是否改用java.lang.String?

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.

我使用的是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.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为什么这么做?我该怎么办 修好它

  • 为什么Xalan会这样做?因为Xalan是XSLT1.0处理器,任何符合XSLT1.0的处理器都只支持XPath1.0是XPath 2.0的标准函数,必须在任何符合XSLT 2.0的处理器中实现

  • 如何修复它?通过使用XSLT2.0处理器,如Saxon 9.xAltovaXML2010。或者编写一个命名的递归的
    ,在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]','')"/>