我正在使用以下 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 读取为“所有前面的第一个 贡献
,具有属性 @speaker-reference
”,而 Oracle 认为“前面的 contribution
具有属性 @speaker-reference 和 position()=1
”。
其实我本来打算第一个解释。我想知道根据 XPath 规范,这两种解释中哪一种是正确的(找不到合适的地方查看),或者规范是否允许表达式有歧义。
最佳答案
根据XML Path Language Specification ,方括号运算符 [..]
的优先级为 19,而斜杠 /
的优先级为 18。这意味着最后一个方括号 [1]
应该应用于斜杠 /
之后的表达式部分,而不是整个表达式。也就是说,Oracle的解释是对的。
Java 的实现* 不符合标准,它在 /
表达式两边没有括号的情况下为您提供正确的结果。考虑提交一个带有简短示例的错误,并解释发生了什么。
* 讽刺的是,这也是 Oracle 的实现。
关于java - XPath 歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31877765/