/和/ root-node之间的区别

时间:2014-03-04 10:26:01

标签: xpath

我的文档如下所示:

<a>
    whatever
</a>

如果我在整个文档上运行//a,则返回(至少有效)。 如果我运行/a/..,则返回整个文档。 但是/..返回一个空序列 考虑到//a返回同一节点,/a/../..的不同之处是什么?

2 个答案:

答案 0 :(得分:5)

文档节点

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

document{
  <a>
      whatever
  </a>
}

对查询的影响

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

我们为什么需要文档节点

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

document       ::=           prolog element Misc*
Misc           ::=           Comment | PI | S

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

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

document {
  <a>
      whatever
  </a>
  <!-- Just do nothing -->
  <?php foo(); ?>
}

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

答案 1 :(得分:4)

表达式//a不相同,不会返回整个文档。 /选择包含文档根的节点集。 XPath中的root node(或XPath 2.0中的document node)是位于文档元素上方的虚拟节点。/a选择包含文档元素的节点集。

表达式/a/..选择作为根节点的文档元素的父元素。表达式/..选择根节点的父节点。由于根节点没有父节点,因此它返回空节点集。此表达式也是选择空节点集的常用习惯用法。