XPath表达式/
返回文档节点。
/html
的XPath表达式等同于/child::html
,并且给定HTML文档将返回html元素。这当然是通过转到文档节点(由/
表示)然后找到元素 child 来评估的。
为什么/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()
。
/html
隐含/child::html
,但/attribute()
隐含/attribute::attribute()
。
答案 0 :(得分:2)
这似乎是XML Spy中的一个错误。
- 如果从轴步骤中省略轴名称,则默认轴为
醇>child
,但有两个例外:如果轴步骤中的NodeTest包含AttributeTest或SchemaAttributeTest,则默认轴为attribute
;如果轴步骤中的NodeTest是NamespaceNodeTest,则会引发静态错误[错误: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()