selectSingleNode

selectNodes メソッド、 selectSingleNode メソッド (DOM)

[1] MS独自拡張selectNodesメソッドについて <http://members.jcom.home.ne.jp/jintrick/Personal/d20029f.html#d15_11>

(名無しさん [sage])

[2] Hawk's W3 Laboratory : XML : DOMとXPathの連携 <http://www.hawk.34sp.com/stdpls/xml/dom_xpath.html#case-msxml> <http://web.archive.org/web/20060902115428/www.hawk.34sp.com/stdpls/xml/dom_xpath.html>

MSXMLにおいて、上で解説するXPathによるノード選択を利用するには、MSXML API History <http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/htm/sdk_history_8zqx.asp?frame=true> などから推測するに、バージョン2.6以降が必要となるようです。対応するIEのバージョンとしてはIE6以降となります(参考 <http://www.microsoft.com/japan/developer/workshop/xml/general/replacemode.asp>)。

ではそれ以前のバージョンでは、上記の内容は一切無効なのかというと、実はそうでもありません。例えば selectNodes/selectSingleNodeメソッドはMSXMLのバージョン2.0から既に実装されています。ただ「XPathによる選択」が可能なのはバージョン2.6以降なのです。SelectionLanguageの解説でも少し触れましたが、それより前のバージョンの selectNodes/selectSingleNodeメソッドで使用できる選択言語は”XSL Pattern”という、XSLのWorking Draft段階において存在した選択言語です。この言語は、ルートからの位置を/で区切って指し示すなど、現在のXPathと一部共通する文法を持っています。つまり、ごく簡単なXPathならばそのまま使用することが出来るということです。

このあたりの変遷について、多少推測混じりになりますが時系列を追ってみますと、

  1. MSXML2.0には、(恐らく当時最新だった)”XSL Pattern”を使用して要素を選択する selectNodes/selectSingleNodeというメソッドが存在した。
  2. MSXML2.6で、selectNodes/selectSingleNodeは(多分そのころ正式勧告になった)XPath1.0に対応した。しかし後方互換性を保つためデフォルトの動作は”XSL Pattern”のまま据え置かれ、選択言語を切り替えるためのsetProperty メソッドと SelectionLanguage プロパティが用意された。
  3. MSXML4.0からは”XPath”が唯一の選択言語となり、 SelectionLanguageを設定する必要はなくなった。

根拠としたのはMSXMLのSDKや、以下のページなどです。 MSXML 3.0 Supports XPath 1.0, XSLT 1.0, XDR, and SAX2 <http://msdn.microsoft.com/msdnmag/issues/0900/xml/default.aspx> 内容は全然関係ないですが、Microsoftのページですからある程度信頼できるでしょう。

また先述したようにMSXML3.0以前ならば SelectionLanguageを指定しないことで2.5以前の動作が再現できます。完全なチェックはしていませんが、IE6+MSXML3.0で概ね仕様書通りの動作をすることを確かめました。(ただしfirst-of-type()などは最初から実装されていないのか、動作しませんでした)

[3] d:id:quaa (2007-07-22 14:20:44 +09:00 版) <http://d.hatena.ne.jp/quaa/20070722#p1> (名無しさん 2007-07-22 05:45:52 +00:00)

[4] Hatena::agenda - Javascript1.7のカスタムイテレータとXPath ( 版) <http://d.hatena.ne.jp/jintrick/20070904>

[5] Chrome は実装していないようです。