xmlnsが明示されていてもevaluate関数のデフォルトはhtmlだった

evaluate関数の挙動をよく理解してなくてちょっとハマった。
以下のようなrssデータからXPathでitem要素を抜き出そうとしたが、うまくノードが取得できなかった。

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:hatena="http://www.hatena.ne.jp/info/xmlns#"
 xmlns:media="http://search.yahoo.com/mrss"
>
(snip)
  <item rdf:about="http://b.hatena.ne.jp/noplans/20090610#bookmark-13904127">
    <title>はてなダイアリーの一覧を取得する非公式のAPI - 今日もスミマセン。</title>
    <link>http://d.hatena.ne.jp/snaka72/20090605/1244175573</link>
    <description>(コメント)</description>

そのとき書いていたコードはこんな感じ

  evaluateXPath("//item", res.responseXML,self.nsResolver);

    // reffered  _libly.js
    evaluateXPath: function(xpath, context, nsresolver) {
      if (!xpath) return [];

      var ret = [];
      context = context || window.content.document;
      var nodesSnapshot = (
        context.ownerDocument ||
        context
      ).evaluate(
        xpath,
        context,
        nsresolver || self.nsResolver,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
        null
      );

      for (let i = 0, l = nodesSnapshot.snapshotLength; i < l; i++) {
          ret.push(nodesSnapshot.snapshotItem(i));
      }
      return ret;
    },

    nsResolver: {
        lookupNamespaceURI: function(pfx) (({
          'rdf'         : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
          'content'     : "http://purl.org/rss/1.0/modules/content/",
          'taxo'        : "http://purl.org/rss/1.0/modules/taxonomy/",
          'opensearch'  : "http://a9.com/-/spec/opensearchrss/1.0/",
          'dc'          : "http://purl.org/dc/elements/1.1/",
          'hatena'      : "http://www.hatena.ne.jp/info/xmlns#",
          'media'       : "http://search.yahoo.com/mrss"
        })[pfx] || 'http://purl.org/rss/1.0/')
    },

ネームスペースリゾルバってのを初めて使ったのでよくわかってなかったんだけど...

上記のxmlだとプレフィクスを省略した場合はrssのネームスペースを表していて、nsResolver.lookupNamespaceURI()もデフォルトがrssのネームスペースを指すようになっているので、これで問題無いように思えた、
しかし実際に動かしてみると全然だめ、要素が取得できない。

namespaceResolver is a function that will be passed any namespace prefixes and should return a string representing the namespace URI associated with that prefix. It will be used to resolve prefixes within the XPath itself, so that they can be matched with the document. null is common for HTML documents or when no namespace prefixes are used.

document.evaluate - MDC

どうやら、XPathの式でタグ名のプレフィクスを省略するとHTMLのネームスペースを使用するため、nsResolverの関数は呼び出されていない模様。
と、いうわけで、rssのタグを抜き出す場合にプレフィクスを省略せず、とりあえず"rss"と指定するとうまくいった。

こんな感じ。

      return self.evaluateXPath("//rss:item", res.responseXML, self.nsResolver);

いちおう"rss"ってしてるけど、lookupNamespace()関数を呼び出したときに'http://purl.org/rss/1.0'というネームスペースが選択されればいいので、'hoge'とかでも別にかまわない。