изменение saxon-HE на net.sf.saxon.xpath.XPathExpressionImpl.evaluate (Object, QName) с 9.6 - PullRequest
0 голосов
/ 04 ноября 2019

Я нахожусь на Fuse 7.4 с Saxon-HE 9.8.0-8, использующим функцию XPath Apache Camel для оценки выражения normalize-space(in:header('myheader')) castable as xs:dateTime.

Это ошибка с нулевым указателем на функцию net.sf.saxon.xpath.XPathExpressionImpl.evaluate(Object node, QName qname), поскольку один из параметров node является нулевым.

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 нулевым, и обрабатывает ли он по-другому. Начиная с 9.6 Saxon-HE, проверка была удалена, в результате чего NPE бросается, когда node равен null.

Любая причина, почему это было сделано на Саксоне и есть ли какие-либо исправления или обходные пути для этого?

Один из обходных путей, который я могу придумать, - это установить фиктивное тело перед вызовом выражения xpath для Camel, но мне просто любопытно, как изменилось Saxon-HE, чтобы убрать нулевую проверку.

1 Ответ

0 голосов
/ 05 ноября 2019

К сожалению, JAXP XPath API никогда не определялся для версий XPath более поздних, чем 1.0, поэтому нам (Saxonica) пришлось принимать собственные решения о том, как расширить семантику API, чтобы он работал с более поздними версиями XPath. Одно из изменений между XPath 1.0 и 2.0 заключается в том, что вполне возможно и целесообразно выполнять выражения XPath без элемента контекста, и в этой ситуации создание пустого пустого документа для выражения, с которым нужно работать (как должно быть сделано в JAXP),неуместно.

Я не уверен, что Саксон когда-либо реализовывал то, что спецификация JAXP говорит для этой ситуации, а именно, создание пустого документа. Вероятно, именно этот факт заставил нас пересмотреть то, что мы должны делать. Но это по крайней мере 5 лет и несколько крупных саксонских релизов назад, поэтому у меня нет ясной памяти об этом.

...