dポイントプレゼントキャンペーン実施中!

XPATHについての質問です。以下は何が異なるのでしょうか?

preceding-sibling::*[1][aaa]
preceding-sibling::*[1][self:aaa]
preceding-sibling::*[1][name()='aaa')]

A 回答 (1件)

preceding-sibling::*[1][aaa]



<a>
<b xml:id="x0100">
<aaa id="x0101"></aaa>
</b>
<b xml:id="x0200">
<aaa id="x0201"></aaa>
</b>
<c xml:id="x0300"/>
</a>

現在c要素を指しているとすると
要素名関係(*)なくpreceding-siblingを取って来る。その時の順番はreverse orderであるから

preceding-sibling::*[1]/@id は x0200
preceding-sibling::*[2]/@id は x0100

です。

その1番目の要素、つまりx0200の要素(ここまで今回はたまたま1個しかない条件)の中で
「aaa要素を子要素として持つ」という条件を満たすものです。= x0200の要素は条件をみたすのでこれが選ばれる。

preceding-sibling::*[1][self:aaa]

名前空間接頭辞selfに関連付けられた名前空間のaaa要素を子に持つ、という条件をみたすかどうか、という条件に変わっただけです。

ちなみに、
preceding-sibling::*[1][self::aaa]
はx0500の要素から見て、0x400の要素です。
preceding-sibling::*[1]自身の要素名が名前空間なしのaaaですから。

<a>
<b xml:id="x0300" />
<aaa xml:id="x0400" />
<c xml:id="x0500"/>
</a>

preceding-sibling::*[1][name()='aaa')]
は構文エラー
preceding-sibling::*[1][name()='aaa']
は最後の条件が「コンテキストノードのQNameが'aaa'」ということでpreceding-sibling::*[1][self::aaa]と同じ結果になるでしょう。

#厳密には[]でくくられたPredicateはnodeからbooleanへの変換がかかっていると思うけどね。
http://www.w3.org/TR/xpath/#predicates
#QNameって何?とかコンテキストノードって何?って聞かないでね。
    • good
    • 0
この回答へのお礼

詳しい説明までありがとうございます。

お礼日時:2010/06/19 14:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!