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

时间:2018-03-16 19:04:34

标签: xml xpath xpath-2.0 xmlspy xpath-3.0

XPath表达式/返回文档节点。

/html的XPath表达式等同于/child::html,并且给定HTML文档将返回html元素。这当然是通过转到文档节点(由/表示)然后找到元素 child 来评估的。

是一个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()

更新:作为一个不相关的FYI,我从Mads Hansen的回答中学到了一些新东西:在XPath 2和XPath 3中,空轴是隐含的子轴,除非有属性测试;如果有属性测试,它实际上是一个隐含的属性轴。因此,虽然/html隐含/child::html,但/attribute()隐含/attribute::attribute()

1 个答案:

答案 0 :(得分:2)

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

3.3.5 Abbreviated Syntax

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

使用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()
相关问题