XPath:为什么/document-node()匹配文档节点?

3
/的XPath表达式返回文档节点。 /html的XPath表达式等同于/child::html,给定一个HTML文档将返回html元素。当然,这是通过转到文档节点(由/表示),然后找到作为html标记的子级元素来评估的。
那么为什么/document-node()实际上返回文档节点呢?
根据一般的XPath表达式规则,我会认为/document-node()等同于/child::document-node(),而/child::document-node()应返回一个空节点序列(因为文档节点从不是文档节点的子节点)。事实上,/child::document-node()确实返回一个空节点序列,这使我相信/document-node()不等同于/child::document-node()。这似乎违反了一般的XPath表达式规则,其中空轴是一个暗示的子轴1
是否有某些特殊规则,使得当您拥有document-node()的步骤时,轴被假定为self而不是child?我正在使用最新版本的Altova XMLSpy(2018 sp1)。或者,这是XMLSpy中的错误吗?或者是我对一般的XPath表达式规则的理解有误?
注:对于任何尝试此操作的人,请注意,只有XPath 2和XPath 3支持document-node()1更新:作为一个无关的FYI,我从Mads Hansen的答案中学到了一些新东西:在XPath 2和XPath 3中,空轴是一个暗示的子轴,除非存在属性测试;如果存在属性测试,则实际上是一个隐含的属性轴。因此,虽然/html是隐式的/child::html,但/attribute()实际上是隐式的/attribute::attribute()
1个回答

2

这似乎是XML Spy中的一个错误。

3.3.5 缩写语法

  1. 如果在轴步骤中省略了轴名称,则默认轴为child,有两个例外:如果轴步骤中的NodeTest包含AttributeTest或SchemaAttributeTest,则默认轴为attribute;如果轴步骤中的NodeTest是NamespaceNodeTest,则会引发静态错误[err:XQST0134]。

经过Saxon 9.8.0.8(HE、PE、EE)和MarkLogic 9.0.3的验证,XPath /document-node()/child::document-node()都没有选择任何内容。

这些具有不同轴名称的XPath选择了document-node()

/self::document-node()
/ancestor-or-self::document-node()
/*/ancestor::document-node()
/*/ancestor-or-self::document-node()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接