[1] [[DOM水準3]] で定義されている[DFN[[[界面]] [CODE(DOMi)[XPathNSResolver]]]] は、 [[XPath]] [[式]]を解釈するに当たって[[名前空間接頭辞]]を[[名前空間URI]] に[[解決]]する必要が生じた時に呼び出される[[メソッド]] [CODE(DOMm)[[[lookupNamespaceURI]]]] が定義されている[[界面]]です。 [2] 仕様書: - [[DOM水準3]] -- [[XPath]] [CODE(DOMi)[XPathNSResolver]] [3] 界面: -'''メソッド [CODE(DOMm)[[[lookupNamespaceURI]]]]''': [[名前空間接頭辞]]を受け取り、[[名前空間URI]] を返します。 [4] '''[CODE(DOMi)[Node]] の [CODE(DOMm)[XPathNSResolver]]''': [[DOM水準3]] の [CODE(DOMi)[[[Node]]]] [[界面]]でも [CODE(DOMm)[lookupNamespaceURI]] メソッドが定義されています。 [CODE(DOMi)[XPathNSResolver]] のメソッドは [CODE(DOMi)[Node]] のメソッドの subset のような定義になっています。 ([CODE(DOMi)[Node]] 界面を直接使わないのは、 [[節点]]を使わなくても名前空間解決ができるようにするためと、 [[DOM水準3]] [[中核]]モジュールの実装がなくても [[XPath]] モジュールを使えるようにするためらしいです。) [5] '''接頭辞無しの既定名前空間''': [[XPath 1.0]] において[[名前空間接頭辞]]が無い [CODE[[[QName]]]] ([[既定名前空間]]) は [[null名前空間]]に固定されています。 ですから少なくても [[XPath 1.0]] の[[式]]の解釈のために [CODE(DOMm)[[[lookupNamespaceURI]]]] の引数に [CODE(DOM)[[[null]]]] や空文字列が渡されることはなく、渡された場合の結果は未定義とされています [SRC[DOM 水準3 XPath]]。 [WEAK[([CODE(DOMi)[[[Node]]]] 界面の同名のメソッドは [CODE(DOM)[[[null]]]] が渡された場合の動作も定義されています。)]] [[#comment]] * 作成 [6] '''節点から作成''': [CODE(DOMi)[[[XPathEvaluator]]]] [[界面]]で定義されている [CODE(DOMm)[[[createNSResolver]]]] メソッドは、 [CODE(DOMi)[[[Node]]]] を受け取って [CODE(DOMi)[[[XPathNSResolver]]]] を作成します。 作成された [CODE(DOMi)[[[XPathNSResolver]]]] は、 [CODE(DOMm)[[[lookupNamespaceURI]]]] メソッドが呼ばれたら [CODE(DOMi)[[[Node]]]] の [CODE(DOMm)[[[lookupNamespaceURI]]]] メソッドを呼ぶような動作をします [SRC[DOM 水準3 XPath]]。 [[XML]] の[[要素]]の[[内容]]として書かれている [[XPath]] の[[式]]を、その[[要素]]における[[名前空間]]の束縛に従って解釈する、 というような場面でこの方法で作成した [CODE(DOMi)[[[XPathNSResolver]]]] を使うと便利そうです。 [7] '''節点からキャストで作成''': [[DOM水準3]] の[[中核]]モジュールと [[XPath]] モジュールの両方に対応した気が利いた [WEAK[([Q[[[界面]]]]の概念を持つ言語での)]] [[DOM]] の実装なら、 [[DOM水準3]] の [CODE(DOMi)[[[Node]]]] 界面を実装した物体が [CODE(DOMi)[[[XPathNSResolver]]]] 界面も実装しているはずです。ですから、 [PRE(example java code)[ resolver = (XPathNSResolver) document.getElementById ("someElement"); ]PRE] のようなことが [WEAK[(>>6 を使わずに)]] できるでしょう。 [8] '''[CODE(DOMm)[lookupNamespaceURI]] メソッドを持った物体を作成''': [[型]]に関して弱い言語なら、適当に [CODE(DOMi)[[[lookupNamespaceURI]]]] メソッドを持つ物体を用意すれば OK です。例えば >>7 にある例は [PRE(example JS code)[ resolver = document.getElementById ("someElement"); ]PRE] のように特に何もしなくても大丈夫です。また、 [PRE(example JS code)[ resolver = { lookupNamespaceURI: function (pfx) { switch (pfx) { case 'xhtml1': return "http://www.w3.org/1999/xhtml"; case 'xhtml2': return "http://www.w3.org/2002/06/xhtml2/"; default: return null; } } }; ]PRE] のような感じで物体を作ってもよいです。 [[#comment]] * メモ [9] 参考: -[10] [CITE[XUL Apps > Tips > DOM3 XPathをノードの検索に活用する - outsider reflex]] -[11] [CITE[Hawk's W3 Laboratory : XML : XPathと名前空間]] -[12] [CITE[Hatena::agenda]] [[XPath]] モジュール全体の使い方は >>10 を見ればよいでしょう。 >>11 と >>12 は名前空間の扱いに少々誤解がみられます。