アカウント名:
パスワード:
HTML文書に対して //div[@class='blue'] というXpath式を用いると、文書内にある「class属性の値がblueであるdiv要素すべて」がノード集合として返される。ここで、 //div[@class='blue'][3] という式で「それらdiv要素のうち3番目のもの」が返されるものと思ったが、これは間違いだった。 //div[@class='blue'] および //div[3] の、2つの集合の積集合が返されるだけだった。
Opera 9.10では //[name()='div'][@class='blue'][3] という式で「class属性の値がblueであるdiv要素のうち、3番目のもの」が返されることがわかったが、Firefox 2.0では「正当な式にあらず」例外になる。どうしたものか。
しかし親コメント第3段落にあるような、ノードテスト部の無い(?)式というのもも正しくないように思える。テストページでいろいろ試してみたところ、次の2番目の式で目的のものが得られるとわかった。
/descendant-or-self::node() /div[@class="blue"][3]/コンテキストノード以下の任意ノード/div[divの述部] /descendant-or-self::div [@class="blue"][3]/コンテキストノード以下のdiv [divの述部]
コンテキストノード以下のすべてのノードの子について、述部条件を満たすdivが検索される、ということか。
というあたりの話は、仕様書 短縮シンタックス [w3.org](翻訳1 [doraneko.org]、翻訳2 [infoteria.com])の注記にも書いてあったか。きちんと読まねば。
もう一つ訂正。式が / で始まっている時点でドキュメントルートを指す。親コメントの式はコンテキストノードとは関係なく、次のような意味となる。
/descendant-or-self::node() /div[@class="blue"][3]ドキュメントルート以下の任意ノード /div[divの述部] /descendant-or-self::div [@class="blue"][3]ドキュメントルート以下のdiv [divの述部]
これはテストページでも確認できる。コンテキストノードを文書中のdiv要素に取っていても、 //title や //script でテストページのtitle要素やscript要素が得られる。
コンテキストノード以下に3番目に登場する div[@class='blue'] を求めるような場合には ./descendant-or-self::div[@class='blue'] としなくてはいけない。コンテキストノードの子孫にdiv要素をすべて検索するような場合には、単純に .//div でよいだろう。
なんだか、スタート地点の数文字で七転八倒してるな。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson
述語で絞りこんだうちのn番目 (スコア:1)
HTML文書に対して //div[@class='blue'] というXpath式を用いると、文書内にある「class属性の値がblueであるdiv要素すべて」がノード集合として返される。ここで、 //div[@class='blue'][3] という式で「それらdiv要素のうち3番目のもの」が返されるものと思ったが、これは間違いだった。 //div[@class='blue'] および //div[3] の、2つの集合の積集合が返されるだけだった。
Opera 9.10では //[name()='div'][@class='blue'][3] という式で「class属性の値がblueであるdiv要素のうち、3番目のもの」が返されることがわかったが、Firefox 2.0では「正当な式にあらず」例外になる。どうしたものか。
Re:述語で絞りこんだうちのn番目 (スコア:1)
しかし親コメント第3段落にあるような、ノードテスト部の無い(?)式というのもも正しくないように思える。テストページでいろいろ試してみたところ、次の2番目の式で目的のものが得られるとわかった。
Re:述語で絞りこんだうちのn番目 (スコア:1)
コンテキストノード以下のすべてのノードの子について、述部条件を満たすdivが検索される、ということか。
Re:述語で絞りこんだうちのn番目 (スコア:1)
というあたりの話は、仕様書 短縮シンタックス [w3.org](翻訳1 [doraneko.org]、翻訳2 [infoteria.com])の注記にも書いてあったか。きちんと読まねば。
Re:述語で絞りこんだうちのn番目 (スコア:1)
もう一つ訂正。式が / で始まっている時点でドキュメントルートを指す。親コメントの式はコンテキストノードとは関係なく、次のような意味となる。
これはテストページでも確認できる。コンテキストノードを文書中のdiv要素に取っていても、 //title や //script でテストページのtitle要素やscript要素が得られる。
コンテキストノード以下に3番目に登場する div[@class='blue'] を求めるような場合には ./descendant-or-self::div[@class='blue'] としなくてはいけない。コンテキストノードの子孫にdiv要素をすべて検索するような場合には、単純に .//div でよいだろう。
なんだか、スタート地点の数文字で七転八倒してるな。