2016-07-20 3 views
2

中ノード:のXPathコンテキストDTDを見て軸ナビゲーション

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

そして、次の単純なXMLは:(Iは便宜上の要素をタグ付け)

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

Iは、次のクエリを実行する場合:

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

[1]を適用する前に、a)とb)の両方で、XMLツリー内のすべてのbを取得します。
しかし、私が最初のbを求めるとき、a)では{b1、b2}を得て、b)では{b1}しか得ません。
私の質問は、このシナリオのコンテキストノードに関する論理は何ですか?言い換えれば、 "/ descendant-or-self :: node()/ b"(これは "//"と同等です)と "/ descendant-or-self/b"の違いは何ですか?

答えて

1

/descendant-or-self::node()/b[1]/descendant-or-self::node()/child::b[1]ための短い/descendant-or-self::node()/b[1]として親要素の最初の([1]b子であるすべてのb要素を選択します。 /descendant-or-self::bは文書内のすべてのb要素を選択し、/descendant-or-self::b[1]で最初の要素を選択します。

+0

一般的に、/ descendant-or-self :: bはコンテキストノードがどこから "子孫 - または - 自己"に移動する "自己"であるかをすべて返します。もしそうなら、 "/ descendant-or-self :: b [2]"私の例では、XMLファイルのルートに二番目に近いタグを取得しますか? – sel

関連する問題