使用Saxon-HE 9.6.0-6计算xpath 1.0表达式



我的项目使用的是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函数在参数包含多于一个元素的序列时抛出这个。

它以前工作得很好。如何使它工作而不改变我的路径

Saxon现在为XPath求值提供了两个API: JAXP API和s9api API。Saxon对JAXP API的实现朝着尽可能与JAXP规范保持一致的方向发展,包括删除了setbackwardcompatible()方法等扩展。然而,XPathEvaluator允许您使用getStaticContext()访问StaticContext,并且它有一个选项setBackwardsCompatibilityMode(),它应该恢复旧的行为。

或者,在s9api XPathCompiler类上也有一个方法setbackwardcompatible()。

如果您想利用XPath 2.0的优势,您可能会希望转向s9api接口,因为JAXP不支持XPath 2.0的更丰富的类型系统。

最新更新