从9.6开始,saxon-HE更改为net.sf.saxon.xpath.XPathExpressionImpl.evaluate(Object,QName)

我在使用Saxon-HE 9.8.0-8的Fuse 7.4上使用Apache Camel的XPath函数来计算表达式normalize-space(in:header('myheader')) castable as xs:dateTime

由于参数net.sf.saxon.xpath.XPathExpressionImpl.evaluate(Object node,QName qname)之一为空,因此node函数出现nullpointerexception失败。

java.lang.NullPointerException
at net.sf.saxon.xpath.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:172)
at org.apache.camel.builder.xml.XPathBuilder.doInEvaluateAs(XPathBuilder.java:977)
at org.apache.camel.builder.xml.XPathBuilder.evaluateAs(XPathBuilder.java:850)
at org.apache.camel.builder.xml.XPathBuilder.matches(XPathBuilder.java:172)

我从Saxon-HE的源代码中看到,在9.5版之前,方法XPathExpressionImpl.evaluate检查node是否为null并以不同的方式处理。从Saxon-HE 9.6开始,该支票已被删除,导致当nodenull时抛出NPE。

任何原因,为什么要在Saxon上完成,以及对此是否有任何修复或解决方法?

我可以想到的一种解决方法是在Camel上调用xpath表达式之前设置一个虚拟主体,但是我只是对Saxon-HE的更改感到好奇,以消除空检查。

ggyy919 回答:从9.6开始,saxon-HE更改为net.sf.saxon.xpath.XPathExpressionImpl.evaluate(Object,QName)

不幸的是,从未为1.0之后的XPath版本定义过JAXP XPath API,因此我们(萨克萨尼卡州)必须做出自己的决定,如何扩展API的语义才能使其在更高的XPath版本中使用。 XPath 1.0和2.0之间的变化之一是,在没有上下文项的情况下完全有可能并且明智地执行XPath表达式,在这种情况下,似乎创建了一个空的空文档供表达式使用(如JAXP指定的那样)不适当的。

我不确定Saxon是否会针对这种情况实施JAXP规范所说的内容,即创建一个空文档。可能正是这一事实使我们重新考虑了应该做什么。但是,这至少已有5年了,并且是Saxon的多个主要发行版本,所以我对此没有明确的记忆。

本文链接:https://www.f2er.com/3164077.html

大家都在问