/和/ root节点之间的区别

cal*_*low 4 xpath

我的文档如下所示:

<a>
    whatever
</a>
Run Code Online (Sandbox Code Playgroud)

如果我运行//a对整个文档返回(至少有效)。如果我运行/a/..,则返回整个文档。但/..返回一个空序列考虑 //a正在返回相同的节点怎么来的/a/../..有什么不同?

Jen*_*rat 5

文档节点

您作为文档提供的XML代码实际上包装在另一个节点“文档节点”中。文档是另一种节点,其他是元素,属性,文本节点,注释和处理指令。使用XQuery / XPath 2.0表示法,它将看起来像这样:

document{
  <a>
      whatever
  </a>
}
Run Code Online (Sandbox Code Playgroud)

对查询的影响

  • / 选择文档节点
  • /a 选择根元素,它是文档节点的唯一子元素
  • /.. 返回空序列,因为文档节点没有父节点
  • /a/.. 再次选择根元素的父节点,它也是文档节点
  • /../a没有结果,因为我们“走出树”(与相比/..

为什么我们需要一个文档节点

文档节点很重要,因为XML规范允许其他节点跟随根节点,即处理指令和注释(和空白)。从XML语法:

document       ::=           prolog element Misc*
Misc           ::=           Comment | PI | S
Run Code Online (Sandbox Code Playgroud)

没有文档节点,这些元素对于XPath将是不可访问的,因为它们不是“根元素子树”的元素。

因此,这也将是有效的XML文档(*):

document {
  <a>
      whatever
  </a>
  <!-- Just do nothing -->
  <?php foo(); ?>
}
Run Code Online (Sandbox Code Playgroud)

(*)这不再是有效的XPath 2.0,因为我们必须给出一个节点序列。,在XPath 2.0必需的每个节点之后,我省略了逗号,因为这仅是出于演示目的。