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

问题描述 投票:0回答:1

我使用的是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是否为空,并且处理方式有所不同。从Saxon-HE的9.6开始,检查已被删除,当nodenull时,将引发NPE。

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

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

xpath apache-camel saxon jbossfuse
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.