使用 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 的更丰富的类型系统。
我的项目使用的是 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 的更丰富的类型系统。