AutoPagerizeのページ区切りをXPathで捕まえようとして名前空間の壁に遭遇した

だめ。0なる。

var p = document.evaluate('//p[@class="autopagerize_page_info"]', document, null, 7, null);
console.log(p.snapshotLength) //0


だめ。エラー。

var p = document.evaluate('//p[@class="autopagerize_page_info"]', document, 'http://www.w3.org/1999/xhtml', 7, null);
console.log(p.snapshotLength) 

[Exception... "Cannot modify properties of a WrappedNative" nsresult: "0x80570034 (NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN)" location: "JS frame


これいけた。

var p = document.evaluate('//*[@class="autopagerize_page_info"]', document, null, 7, null);
console.log(p.snapshotLength)


できた。名前空間ノードテストはこう書くのか

var p = document.evaluate('//*[@class="autopagerize_page_info"][namespace-uri()="http://www.w3.org/1999/xhtml"]', document, null, 7, null);
console.log(p.snapshotLength)

まとめ

気持ちよく//pを軸にsnapshotを撮るにはどうしたらいいのでしょうか。。
てかそもそもnamespaceが関係してるのかな。


これか。XPathNSResolver のクロスブラウザとか - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech
ややこしいなー。


できた!

function resolver(prefix) {
  if (prefix == "h") return "http://www.w3.org/1999/xhtml"
}
var p = document.evaluate('//h:p', document, resolver, 7, null);
console.log(p.snapshotLength)


id:edvakfさんから無名関数をいれてできる方法を教えてもらった。

var p = document.evaluate('//h:p[@class="autopagerize_page_info"]', document, function(){return 'http://www.w3.org/1999/xhtml'}, 7, null);
console.log(p.snapshotLength)

おおー!なるほど。でも、//h:pの部分を//a:pでもできる。へんなの。
こういうのを吸収する便利なものが$X関数なのかー。
以上、はじめて名前空間の壁に遭遇したという話でした。


まとめ2

名前空間(namespace)が設定されているノードをXPathで拾ってくるにはprefexが必要。
引数に関数を突っ込んでみる。

感想

autopagerize_page_infoにnamespaceがつけられている理由はXHTMLを継ぎ足すときに必要だったから?