/
的 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更新:仅供参考,我从 Mads Hansen 的回答中学到了一些新东西:在 XPath 2 和 XPath 3 中,空轴是隐含的子轴,除非有属性测试;如果有属性测试,它实际上是一个隐含的属性轴。因此,虽然/html
是隐式/child::html
,但/attribute()
是隐式/attribute::attribute()
。
这似乎是XML Spy中的一个错误。
3.3.5 缩写语法
如果轴步骤中省略了轴名称,则默认轴为
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()