使用 Saxon-HE 9.6.0-6 评估 xpath 1.0 表达式

evaluating xpath 1.0 expressions with Saxon-HE 9.6.0-6

我的项目使用的是 Saxon 9.0.0.2。我正在尝试升级到 Saxon-HE 9.6.0-6。

XPathEvaluator#setBackwardsCompatible(boolean)

此方法在 9.6.0-6 中不再存在。 我在我的代码中评论了那行,但是当 运行 我收到以下错误:

net.sf.saxon.trans.XPathException: A sequence of more than one item is not allowed as the first argument of name() (<xs:element/>, <xs:element/>, ...)
at net.sf.saxon.expr.Expression.typeError(Expression.java:1123)
at net.sf.saxon.expr.CardinalityChecker.evaluateItem(CardinalityChecker.java:295)
at net.sf.saxon.functions.NameFn.evaluateItem(NameFn.java:52)
at net.sf.saxon.functions.NameFn.evaluateItem(NameFn.java:23)
at net.sf.saxon.expr.Expression.iterate(Expression.java:448)
at net.sf.saxon.xpath.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:192)
at net.sf.saxon.xpath.XPathEvaluator.evaluate(XPathEvaluator.java:239)
at jlibs.examples.xml.sax.dog.engines.SaxonEngine.evaluate(SaxonEngine.java:72)
at jlibs.examples.xml.sax.dog.TestCase.usingDOM(TestCase.java:71)
at jlibs.examples.xml.sax.dog.tests.XPathConformanceTest.run(XPathConformanceTest.java:44)
at jlibs.examples.xml.sax.dog.tests.XPathConformanceTest.main(XPathConformanceTest.java:73)

看起来,如果 name 函数在参数包含多个元素的序列时抛出此问题。

它曾经工作得很好。 如何在不更改 xpath 的情况下使其工作。

Saxon 现在提供两个 API 用于 XPath 评估:JAXP API 和 s9api API。 Saxon 的 JAXP 实现 API 已经朝着尽可能接近 JAXP 规范的方向发展,包括放弃像 setBackwardsCompatible() 方法这样的扩展。但是,XPathEvaluator 允许您使用 getStaticContext() 访问 StaticContext,并且它有一个选项 setBackwardsCompatibilityMode() 应该恢复旧的行为。

或者,s9api XPathCompiler 上还有一个方法 setBackwardsCompatible() class。

如果您想要利用 XPath 2.0,您可能想要移动到 s9api 接口,因为 JAXP 不支持 XPath 2.0 的更丰富的类型系统。