風柳メモ

ソフトウェア・プログラミング関連の覚書が中心。

AutoPagerize等のSITEINFO(XPath)記述時の注意

AutoPagerizeにおいて、次ページのURLは、SITEINFOのnextLinkに記述されたXPath式(xpathExpression)を用いて、

document.evaluate( xpathExpression, contextNode, namespaceResolver, resultType, result ).singleNodeValue

の結果返される要素から取得される。

このとき、resultTypeとしてXPathResult.FIRST_ORDERED_NODE_TYPEを用いているため、例えばSITEINFOとして

nextLink    id("pnnext")|id("navbar navcnt nav")//td[span]/following-sibling::td[1]/a|id("nn")/parent::a

アイテム: Google Search - データベース: AutoPagerize - wedata

のような「|」で連結された記述が有った場合、

  1. id("pnnext")
  2. id("navbar navcnt nav")//td[span]/following-sibling::td[1]/a
  3. id("nn")/parent::a

いずれかにマッチする、文書中で最初に出現した要素が返される(XPath式上での出現順には依存しないことに注意)。

例えば、AutoPagerize - Google 検索においては上記の1.および2.にマッチする要素がそれぞれ存在するが、文書中では2.にマッチする要素が先に出てくるため

javascript:(function(d,n){n=d.evaluate('id("pnnext")|id("navbar navcnt nav")//td[span]/following-sibling::td[1]/a|id("nn")/parent::a',d,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue;alert('node:'+n.nodeName+' id:"'+n.id+'" class:"'+n.className+'"')})(document)

を実行してみると「node:A id:"" class:"fl"」となり、2.にマッチした要素が返されていることがわかる。

つい、XPath式に出てくる順(1.→2.→3.)でマッチした最初のものが返るように誤解してしまいがちなので、覚書として。
そんな誤解をするのは自分だけ?