java - XPath 歧义

标签 java xml oracle xpath

我正在使用以下 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/

相关文章:

Oracle案例运行所有提示

oracle - PL/SQL 动态 SQL

python - libclntsh.so.12.1 的 CX_Oracle 导入错误

Java - 同步原始数组中的各个元素

java - 如何在 Java 中实现常量

python - python 中漂亮的 soup xml 格式

xml - 从命名空间前缀节点中删除 xmlns 属性

java - 我输入了正确的值但打印了错误的值

java - 如何理解java Path.toString()方法

c# - XElement.Element ("Leve1/Level2") 而不是 XElement.Element ("Leve1").Element ("Level2")