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

时间:2015-07-25 07:52:06

标签: xpath saxon

我的项目使用的是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的情况下使其工作。

1 个答案:

答案 0 :(得分:1)

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

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

如果您想利用XPath 2.0,您可能希望转移到s9api界面,因为JAXP不支持更丰富的XPath 2.0系统。