如何获取节点的字符串值?

时间:2018-06-10 18:53:48

标签: java saxon

XPath string(/ROOT/Products/UnitPrice)在dom4j& .NET运行时。但在萨克森州,它抛出了一个例外:

net.sf.saxon.s9api.SaxonApiException: A sequence of more than one item is not allowed as the first argument of string() (<UnitPrice/>, <UnitPrice/>, ...) 

这里发生了什么?为什么这不行?

3 个答案:

答案 0 :(得分:1)

Saxon期望将单个节点作为输入。

.NET实现不同;它只考虑第一个:

  

string()函数通过返回节点集中第一个节点的字符串值将节点集转换为字符串,这在某些情况下可能会产生意外结果。

请参阅MSDN

答案 1 :(得分:1)

问题是:/ROOT/Products/UnitPrice可能返回多个结果,而XPath 2.0 string函数不接受多个参数(see here)。

Saxon符合XPath 2.0标准。要解决您的问题,您可以编写此XPath表达式:

for $price in /ROOT/Products/UnitPrice return string($price)

然后,您必须迭代结果(XdmValue对象)。

答案 2 :(得分:0)

如果您使用的是s9api界面,可以拨打

XPathCompiler.setBackwardsCompatible(true);

使XPath表达式在XPath 1.0兼容模式下运行。这并没有完全复制XPath 1.0行为的所有方面,但它将处理XPath 1.0和2.0之间发生变化的大多数事情。

2.0中引入的不兼容性通常是因为它们会影响1.0中常见的用户错误源。最好不要依赖由string()等函数执行的输入序列的隐式截断;这是许多应用程序错误的原因。

<强> == LATER ==

我们尝试在Saxon-HE 9.8中删除1.0兼容模式,认为10年后很少有人会依赖它。不幸的是,那些少数人大惊小怪,我们决定回溯。但是我刚才看到在HE 9.8中,setBackwardsCompatible()方法会抛出错误,说它不受支持。请尝试改为:

XPathCompiler.getUnderlyingStaticContext().setBackwardsCompatibilityMode(true);