看DTD:

<!ELEMENT root (a|b)+>
<!ELEMENT a (a|b)*>
<!ELEMENT b (a|b)*>


还有以下简单的XML :(为方便起见,我标记了元素)

<root>
  <b1>
    <b2></b2>
    <a1></a1>
  </b1>
  <b3></b3>
</root>


当我执行以下查询时:

a) /descendant-or-self::node()/b[1]
b) /descendant-or-self::b[1]


在a)和b)中,在应用[1]之前,我将XML树中的所有b都获取了。
但是当我要求第一个b时,在a)中我得到{b1,b2},在b)中我只有{b1}。
我的问题是,在这种情况下,上下文节点的逻辑是什么?换句话说,为什么“ / descendant-or-self :: node()/ b”(我知道等同于“ //”)和“ / descendant-or-self / b”之间有什么区别?

最佳答案

/descendant-or-self::node()/b[1]选择作为其父元素的第一个(b[1]子元素的所有b元素,因为/descendant-or-self::node()/b[1]/descendant-or-self::node()/child::b[1]的缩写。 /descendant-or-self::b选择文档中的所有b元素,并使用/descendant-or-self::b[1]选择它们中的第一个。

07-24 21:48