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

Java 如何获取节点的字符串值?,java,saxon,Java,Saxon,XPath字符串(/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/>, ...) net.sf.saxon

XPath
字符串(/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/>, ...) 
net.sf.saxon.s9api.SaxonApiException:字符串()(,…)的第一个参数不允许包含多个项的序列

这是怎么回事?为什么这不正常?

Saxon需要一个节点作为输入

NET实现是不同的;它只考虑第一个问题:

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


请参见

Saxon期望一个节点作为输入

NET实现是不同的;它只考虑第一个问题:

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


请参见

问题是:
/ROOT/Products/UnitPrice
可能返回多个结果,XPath 2.0
字符串
函数不接受多个参数()

Saxon与XPath2.0兼容。要解决您的问题,可以编写以下XPath表达式:

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

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

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

Saxon与XPath2.0兼容。要解决您的问题,可以编写以下XPath表达式:

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

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

如果使用s9api接口,可以调用

XPathCompiler.setBackwardsCompatible(true)

使XPath表达式在XPath 1.0兼容模式下运行。这并不是完全复制XPath1.0行为的所有方面,但它将处理XPath1.0和XPath2.0之间发生变化的大部分事情

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

==以后==

我们试图在Saxon HE 9.8中删除1.0兼容模式,认为10年后很少有人会仍然依赖它。不幸的是,这几个人大惊小怪,我们决定后退。但是我刚刚看到在HE9.8中,setBackwardsCompatible()方法会抛出一个错误,表示它不受支持。请尝试:

XPathCompiler.getUnderlyingStaticContext().setBackwardsCompatibilityMode(true);

如果您使用的是s9api接口,则可以调用

XPathCompiler.setBackwardsCompatible(true)

使XPath表达式在XPath 1.0兼容模式下运行。这并不是完全复制XPath1.0行为的所有方面,但它将处理XPath1.0和XPath2.0之间发生变化的大部分事情

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

==以后==

我们试图在Saxon HE 9.8中删除1.0兼容模式,认为10年后很少有人会仍然依赖它。不幸的是,这几个人大惊小怪,我们决定后退。但是我刚刚看到在HE9.8中,setBackwardsCompatible()方法会抛出一个错误,表示它不受支持。请尝试:

XPathCompiler.getUnderlyingStaticContext().setBackwardsCompatibilityMode(true);

我如何才能将其更改为在萨克森工作?我们有大量的查询需要更正。您能用xml片段和预期结果更新问题吗?
string(/root/products[1]/unitPrice[1])
给出相同的结果,只考虑第一个元素而忽略所有其他元素。这取决于您决定是否匹配您想要实现的目标-可能也是.NET/dom4j实现的结果。如何将其更改为在Saxon中工作?我们有大量的查询需要更正。您能用xml片段和预期结果更新问题吗?
string(/root/products[1]/unitPrice[1])
给出相同的结果,只考虑第一个元素而忽略所有其他元素。这取决于您决定这是否符合您想要实现的目标-可能也是.NET/dom4j实现的结果。谢谢。我们将调整选择,因为我们希望使用2.0。谢谢。我们将调整选择,因为我们希望使用2.0。