/
的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()
。