Jintrick.netagenda2003年03月アーカイブ → 2003年03月29日

DOMのDocumentFragmentとXPath

ここ一ヶ月ほどRDF照会用のJScriptクラスを作って遊んでいたのですが、ようやく(私が使う範囲で)納得ゆくものが出来上がりそうです。あるXPath式によってノードリストを取得して利用した後、そのノードリストを別のXPath式でさらに絞込みをかけ、新たなノードリストを取得する、という方法を多用しました。これは場当たり的なスクリプトを書く際にも重宝しそうです。

MSXML4では、NodeインターフェイスにselectNodesというメソッドがあります。引数にXPathのロケーションパス等(String)を指定することによって、マッチしたノードを含んだノードリストが返却されるというものです。これは当然、Nodeインターフェイスを継承するDocuemntFragmentでも使えます。

var sXpath = '/descendant::*[boolean(@href)]';
var nl = DOMDocument.selectNodes(sXpath);

これでhref属性を持った全ての要素のノードリストを取得したことになります。DOMDocumentは実際に作成したDOMDocumentオブジェクトです。

ある条件に依存して、このノードリストの中からhreflang属性を持ったものを絞り込む必要があるとします。このとき:

var df = DOMDocument.createDocumentFragment();
for(var i = 0, len = nl.length; i < len; i++)
  df.appendChild(nl.item(i));
sXpath = 'self::*[boolean(@hreflang)]';
nl = df.selectNodes(sXpath);

このようにDocumentFragmentをコンテクストノードにすることができます。尤もこの例では無駄が目立ちますが、このDocumentFragmentを他にも色々と応用する場合には効率的になります。

RDF/XMLなサイトマップについて(ちょっと私信かも)

sitemap.xmlは、XHTML形式のサイトマップに変換するのが楽なので一応ツリー構造にしてありますが、あれはトリプルの単位でバラバラに分解しても意味は同じで、同じように利用できます。それどころか、単一の文書にまとまっていなくても、各トリプルが崩れなければ意味は同じです。何か外しているかもしれませんが一応。

私は、ノードとアークに着目し、トリプル以上の構造には一切依存しないような照会方法を使っています。参照したいノードがあった場合、まず「型」を作ります。ノードのタイプやアークの種類その他をプロパティにしたオブジェクトを作り、その「型」にマッチしたノードを返却するメソッドを呼び出して、目的のノードを得ます。ですから、XMLの見かけ上のツリー構造が崩れていても関係ないですし、rdf:RDF要素の場所さえ知っていれば、複数の文書にまたがって叙述されていても同じように参照できます。

RDF/XMLの変則的な構文全てに対応するのはちと気違い沙汰なので、ローカルで完結しているのが悔しいところですが、良い実装を手に入れれば相当に面白そうです。


webmaster@jintrick.net
公開: 2003年03月29日
カテゴリ: DOM ,Javascript ,XPath