观看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}。
我的问题是,在这种情况下,关于上下文节点的逻辑是什么?换句话说,为什么&#34; / descendant-or-self :: node()/ b&#34;之间存在差异? (我知道相当于&#34; //&#34;)和&#34; / descendant-or-self / b&#34;?
答案 0 :(得分:1)
/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]
选择第一个元素。