整理する

頭が悪いかもしれないが、下のを具体的に実行すると内部ではこんな動きになる。基本的にスラッシュで分割してからスタート。

//td[@width="640" and @align="center"]
getElementsByTagName("td") して td を全部取得。取得した td から getAttribute("width") と getAttribute("align") して合致したものをHTMLElementのリストに格納。
/ancestor::table[last()]
取得済みのHTMLElementからparentElementで上がっていって、最後の table を格納?(上で td が2個ヒットしてたらどうすんだ?2個目の一番上?)
/following-sibling::node()[1]
following-siblingはコンテキストノードより後ろの兄弟ノード全部。node()は子ノード全部。で、それの1個目。弟全ての子全ての1個目?要はnextSiblingのfirstChildということか?

適当な構文解析で順番通りやると、最終目的のものまでに一々取ってくるものが多くなってしまう。インデックスとかは特に先に見ておいたほうが効率的だと思うが、とりあえずめんどくさいな。

//div[@class="pages"]/a[last()][@class="nextprev"]

今見てたらこんなのあった。[last()]と[@class="nextprev"]の順序がこれで正しいとするなら、右から処理したほうがいいのかなあ?と思って仕様を確認したらやっぱ逆だ。

  • para[@type="warning"][5] はコンテキストノードの para という名前の子エレメントのうち、warning という値の type という名前のアトリビュートを持つ5番目のエレメントを選択する。
  • para[5][@type="warning"] は、コンテキストノードの5番目の para という名前の子エレメントが warning という値の type という名前のアトリビュートを持っていれば、それを選択する。
http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm#predicates

上のは最後の a が class="nextprev" じゃなかったらヒットしなくていいんだよね?Firefoxだとヒットすんのかなあ。それだと本家wikiデータを貰うつもりの俺が困る。