3

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

一个 XPath 表达式/html等效于/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 中,除非有属性测试,否则空轴是隐含的子轴;如果有一个属性测试,它实际上是一个隐含的属性轴。所以 while/html是隐含/child::html的,/attribute()是隐含的/attribute::attribute()

4

1 回答 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()
于 2018-03-17T02:44:05.750 回答