【问题标题】:What's the difference between "/node()" and "node()" in XPath?XPath 中的“/node()”和“node()”有什么区别?
【发布时间】:2020-08-18 21:16:00
【问题描述】:

根据我对 XPath 的理解,对于任何 HTML 或 XML 文档:
$x("/node()") 表示 $x("/child::node()") 表示返回作为上下文节点的子节点的节点。这里,根节点(/) 是上下文节点。因此,它返回html 元素。

$x("node()") 表示$x("child::node()"),它也返回相同的html 元素。但是在这种情况下,与上述情况不同,我们没有提供上下文节点。那么,在这种情况下它是如何识别上下文节点的呢?

此外,上述 XPath 表达式在语法和功能上是否相同。

【问题讨论】:

  • 我不同意“因此,它返回html元素”的结论,文档节点或根节点之前和/或之后可以有cmets和处理指令(至少在XML中) /node() 也选择的根元素。虽然 XPath 不知道 DOCTYPE 节点,但我认为 Chrome $x('/node()') 也会包含这样的 DOCTYPE 节点(如果 HTML 文档或可能的 XML 文档中存在)。

标签: html xml xpath


【解决方案1】:

不同之处在于 /node() 将上下文节点绝对指定为文档根 (/),但 node() 依赖于隐含的相对上下文节点。

如何确定隐含的相对上下文节点?好吧,根据上下文。 ;-) 例如,宿主语言通常​​会将初始上下文节点设置为正在匹配或迭代的当前节点。然后,在 XPath 本身的评估中,每个定位步骤(用斜杠分隔,/)为后续步骤建立上下文节点。

Chrome 控制台中使用的$x(path, [startNode]) 表示法采用可选的第二个参数,可用于显式指定上下文节点。默认情况下,它等于文档根节点,这导致观察到$x("node()")$x("/node()") 针对给定文档返回相同结果的行为。

此外,上述 XPath 表达式在语法和功能上是否相同。

显然node()child::node()句法上 不同的,但是,是的,它们是语义上(或功能上,正如你所说) 相同,因为 child:: 轴是默认轴。

另见

【讨论】:

  • 非常感谢您提供如此清晰简洁的解释以及相关帖子。每次阅读您的答案时,我都会从您丰富的知识中学到很多东西。
猜你喜欢
  • 2014-08-28
  • 1970-01-01
  • 2018-07-08
  • 2013-12-02
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多