我正在使用以下XPath片段

ancestor::contribution[1]/preceding-sibling::contribution[@speaker-reference][1]

我的Java应用程序(使用JDOM进行XPath查询)对此解释与我们的Oracle数据库(11g)不同。
我可以通过使用方括号来解决此问题,如下所示:
 (ancestor::contribution[1]/preceding-sibling::contribution[@speaker-reference])[1]

因此,似乎JDOM正在将xpath读取为“具有属性contributions的所有在先@speaker-reference中的第一个”,而Oracle认为“具有属性contribution的在先@speaker-reference and position()=1”。

我实际上打算进行第一种解释。我想知道,根据XPath规范(找不到合适的位置),两种解释中的哪一种是正确的,还是该规范是否允许表达式不明确。

最佳答案

根据XML Path Language Specification,方括号运算符[..]的优先级为19,而斜杠/的优先级为18。这意味着最后一个方括号[1]应该应用于斜杠/之后的表达式部分,而不是整个表达式。换句话说,Oracle的解释是正确的。

Java的实现*可以为您提供正确的结果,但在/表达式周围没有括号,因此不符合该标准。考虑提交一个带有简短示例的Bug,并对发生的情况进行解释。

*具有讽刺意味的是,这也是Oracle的实现。

09-29 21:33