• ベストアンサー

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

XPATHについての質問です。以下は何が異なるのでしょうか? preceding-sibling::*[1][aaa] preceding-sibling::*[1][self:aaa] preceding-sibling::*[1][name()='aaa')]

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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って何?とかコンテキストノードって何?って聞かないでね。

keiji55_1985
質問者

お礼

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

関連するQ&A