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関数なのかー。
以上、はじめて名前空間の壁に遭遇したという話でした。
感想
autopagerize_page_infoにnamespaceがつけられている理由はXHTMLを継ぎ足すときに必要だったから?