XPath:为什么 /document-node() 匹配文档节点?
XPath: Why does /document-node() match the document node?
/
return文档节点的 XPath 表达式。
/html
的 XPath 表达式等同于 /child::html
并且给定 HTML 文档将 return html 元素。这当然是通过转到文档节点(由 /
表示)然后找到元素 child 来评估的,它是一个 html 标签。
为什么 /document-node()
实际上是 return 文档节点?
鉴于一般的 XPath 表达式规则,我假设 /document-node()
等同于 /child::document-node()
,并且 /child::document-node()
应该 return 一个空节点序列(因为文档节点永远不是文档节点的子节点)。事实上 /child::document-node()
确实 return 一个空节点序列,这让我相信 /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()
.
这似乎是 XML Spy 中的错误。
- If the axis name is omitted from an axis step, the default axis is
child
, with two exceptions: if the NodeTest in an axis step contains an AttributeTest or SchemaAttributeTest then the default axis is attribute
; if the NodeTest in an axis step is a NamespaceNodeTest then a static error is raised [err:XQST0134] .
使用 Saxon 9.8.0.8(HE、PE、EE)和 MarkLogic 9.0.3 进行验证,XPath /document-node()
和 /child::document-node()
没有 select 任何东西。
这些具有不同轴名称的 XPaths select document-node()
:
/self::document-node()
/ancestor-or-self::document-node()
/*/ancestor::document-node()
/*/ancestor-or-self::document-node()
/
return文档节点的 XPath 表达式。
/html
的 XPath 表达式等同于 /child::html
并且给定 HTML 文档将 return html 元素。这当然是通过转到文档节点(由 /
表示)然后找到元素 child 来评估的,它是一个 html 标签。
为什么 /document-node()
实际上是 return 文档节点?
鉴于一般的 XPath 表达式规则,我假设 /document-node()
等同于 /child::document-node()
,并且 /child::document-node()
应该 return 一个空节点序列(因为文档节点永远不是文档节点的子节点)。事实上 /child::document-node()
确实 return 一个空节点序列,这让我相信 /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()
.
这似乎是 XML Spy 中的错误。
- If the axis name is omitted from an axis step, the default axis is
child
, with two exceptions: if the NodeTest in an axis step contains an AttributeTest or SchemaAttributeTest then the default axis isattribute
; if the NodeTest in an axis step is a NamespaceNodeTest then a static error is raised [err:XQST0134] .
使用 Saxon 9.8.0.8(HE、PE、EE)和 MarkLogic 9.0.3 进行验证,XPath /document-node()
和 /child::document-node()
没有 select 任何东西。
这些具有不同轴名称的 XPaths select document-node()
:
/self::document-node()
/ancestor-or-self::document-node()
/*/ancestor::document-node()
/*/ancestor-or-self::document-node()