ActiveXObject, Mozilla では createDocument() メソッドを使い、 XML 文書を格納するための「箱」を用意する必要があります。document.implementation.createDocument が使えるようにすれば良いのですが、 イベント定義の時と同様の方法は使えないため、ここでは、次善策として、 document.Implementation.createDocument() メソッドが使えるようにしたいと思います。selectSingleNode() や singleNode() メソッドは MSXML 2.0 で既に実装済みなので、 WinIE 5.x が導入されている環境であれば、簡単な XPath を用いて要素群を引き出すことは出来ます。// createDocument メソッドの定義
function _create(){
 this.createDocument=function(a,b,c){return _createDoc(a,b,c);};
}
function _createDoc(a,b,c) {
 var s=new _xmlDoc(a,b,c);
 return s;
}
// document.Implementation プロパティの定義と createDocument メソッドの登録
var _I=new _create;
document.Implementation=_I;
// createDocument() メソッドの中身を定義
function _xmlDoc(p,q,r){
 var s;
 // XML 文書を格納するオブジェクトを定義
 if (document.all && document.attachEvent){ // MSIE 用
  s=new ActiveXObject("Microsoft.XMLDOM");
  s.setProperty("SelectionLanguage", "XPath");
  s.async=false;
 }
 else if (document.implementation.createDocument){ // Mozilla 用
  s=document.implementation.createDocument(p,q,r);
 }
 // onload イベント制馭の定義
 this.addEventListener=function(ev,func,bl) {
  if (document.all && document.attachEvent) { // MSIE 用
   if (ev=="load") {
    s.onreadystatechange = function(){
     if (s.readyState == 4){func()};
    };
   }
  }
  else if (document.implementation.createDocument){ // Mozilla 用
   s.addEventListener(ev,func,bl);
  }
 };
 // XML 読み込み関数の定義
 this.load=function(fl) {
  s.load(fl);
 };
 // 要素取り出しの定義 (getElementsByTagName)
 this.getElementsByTagName=function(elm) {
  return s.getElementsByTagName(elm);
 };
 //  要素取り出しの定義 (getElementsByTagName)
 this.getElementsByTagNameNS=function(ns,elm) { // MSIE 用(XPath使用)
  if (document.all && document.attachEvent){
   return s.selectNodes("//*[local-name()='"+elm+"' and namespace-uri()='"+ns+"']");  
  }
  else if (document.implementation.createDocument) { // Mozilla 用
   return s.getElementsByTagName(ns,elm);
  }
 }
 // 要素の作成 
 this.createElementNS=function(ns,elm) {
  if (document.all &&  document.attachEvent) { // MSIE 用
   return s.createNode(1,elm,ns); // 汎用ノード作成メソッドを使用
  }
  else if (document.implementation.createDocument){ // Mozilla 用
   return s.createElementNS(ns,elm);
  }
 };
 // DOM3 XPath の evaluate()メソッドの定義
 this.evaluate=function(reg,ob,n1,n2,n3) {
  if document.all &&  document.attachEvent) { // MSIE 用
   var t=new xpathObj(s,reg);
   return t;
  }
  else if (document.implementation.createDocument) {
   return s.evaluate(reg,s,n1,n2,n3);
  }
 };
}
// snapshotItem() 及び snapshotLength の定義
function xpathObj(s,reg) {
 var p=s.selectNodes(reg);
 this.snapshotItem=function(n) {
  return p[n];
 };
 this.snapshotLength=p.length;
}
data.xml を読み込んで xmlD 変数に格納し、その後 startXML() 関数を呼び出してみます。
startXML() 関数では、
p 要素を XPath を用いて elm 変数に格納する。p 要素の数を表示。p 要素内のノード数を表示。をしてみることにします。
MSIE 6.0SP1, Mozilla, Netscape 7 では問題なく動作するようです。
// XML 文書を格納する「箱」を定義
var xmlD = document.Implementation.createDocument("", "", null);
// ファイルを読み込んだ後、 startXML 関数を実行するようにする。
xmlD.addEventListener("load", startXML, false);
// data.xml を読み込む。
xmlD.load("data.xml");
function startXML(){
 // XPath による要素の取り出し
 var elm=xmlD.evaluate("//*[local-name()='p' and namespace-uri()='http://www.w3.org/1999/xhtml']",xmlD,null,6,null);
 // elm 中の要素数
 alert (elm.snapshotLength);
 //elm 中の要素へのアクセス
 alert (elm.snapshotItem(3).childNodes.length);
}
createNode() メソッドを使う必要がありますので、修正させて頂きました(Hawk'sW3L の Hawk 様より御指摘を頂きました)。