From 3750e1daa84085fde2c9789115ca06057d6faf3b Mon Sep 17 00:00:00 2001
From: Masahiro FUJIMOTO この文書では拡張機能や Web サイトから JavaScript 内で XPath を使うためのインターフェースについて解説します。Mozilla は DOM 3 XPath のかなりの部分を実装しており、HTML 文書と XML 文書の双方に対して XPath 式を実行することができます。 この文書では拡張機能やウェブサイトから JavaScript 内で XPath を使うためのインターフェイスについて解説します。 Mozilla は DOM 3 XPath のかなりの部分を実装しており、 HTML 文書と XML 文書のどちらに対しても XPath 式を実行することができます。 XPath を利用するための主となるインターフェースは document オブジェクトの evaluate 関数です。 XPath を使用するための主となるインターフェイスは document オブジェクトの evaluate 関数です。 {{ 英語版章題("document.evaluate") }} このメソッドは XPath 式を XML ベースの文書 ( HTML を含む) に対して評価し、 このメソッドは HTML を含む XML ベースの文書に対して XPath 式を評価し、 {{ 英語版章題("Parameters") }} evaluate 関数は 5 つのパラメータを取ります。 evaluate 関数は 5 つの引数を取ります。 {{ 英語版章題("Return Value") }} パラメータ {{ 英語版章題("Implementing a Default Namespace Resolver") }} 名前空間リゾルバーを作成するには、普通は document オブジェクトの 名前空間リゾルバを作成するには、普通は document オブジェクトの または、 Or alternatively by using the <code>createNSResolver</code> method of a <code>XPathEvaluator</code> object. <pre> var xpEvaluator = new XPathEvaluator(); var nsResolver = xpEvaluator.createNSResolver( contextNode.ownerDocument == null ? contextNode.documentElement : contextNode.ownerDocument.documentElement ); </pre> それから 変数 document.evaluate
-document.evaluate
+XPathResult オブジェクトを返します。 XPathResult オブジェクトは単一のノード、もしくはノードの集合になります。既存のこのメソッドのドキュメントは document.evaluate ですが、このメソッドの解説のためには内容が薄いため、以下でさらに詳しく説明します。XPathResult オブジェクトを返します。 XPathResult オブジェクトは単一のノード、もしくはノードの集合になります。このメソッドの情報は DOM:document.evaluate にありますが、このメソッドの解説のためには内容が薄いため、以下でさらに詳しく説明します。var xpathResult = document.evaluate( xpathExpression, contextNode, namespaceResolver, resultType, result );
+
var xpathResult = document.evaluate( xpathExpression, contextNode, namespaceResolver, resultType, result );
-パラメータ
+引数
-
-
-xpathExpression: 評価する XPath 式を文字列で指定します。
-
-
-contextNode: xpathExpression を評価する対象となる文書内のノードを指定します。指定されたノードの全ての子ノードに対しても評価が行われます。もっともよく指定される値は document です。
-
-
-namespaceResolver: xpathExpression に含まれるあらゆる名前空間接頭辞を渡され、その接頭辞に対応する名前空間 URI を表す文字列を返す関数です。この関数により、XPath 式で使われている接頭辞と文書内で使われている接頭辞が異なっていたとしてもそれを変換する事が可能になります。この関数は次のいずれかです。
+ contextNode: xpathExpression を評価する対象となる文書内のノードを指定します。指定されたノードの全ての子ノードに対しても評価が行われます。もっともよく使用される値は document ノードです。namespaceResolver: xpathExpression に含まれるあらゆる名前空間接頭辞を渡され、その接頭辞に対応する名前空間 URI を表す文字列を返す関数です。この関数により、 XPath 式で使われている接頭辞と文書内で使われている接頭辞が異なっていたとしてもそれを変換することが可能になります。この関数は次のいずれかです。
-
XPathEvaluator オブジェクトの createNSResolver メソッドにより作成されたもの。ほとんどの場合はこれを使うべきでしょう。null 。xpathExpression に名前空間接頭辞が含まれている場合に null を使うと、NAMESPACE_ERR コードと共に DOMException が投げられるので注意してください。XPathEvaluator オブジェクトの createNSResolver メソッドにより作成されたもの。ほとんどの場合はこれを使うべきでしょう。null 。xpathExpression に名前空間接頭辞が含まれている場合に null を使うと、 DOMException がNAMESPACE_ERR コードと共に投げられるので注意してください。
-
-
-resultType: 評価の結果返してほしい値の型を示す定数です。もっとも良く指定される定数は XPathResult.ANY_TYPE で、この場合、指定された XPath 式に対して一番適切な型で結果が返されます。指定できる定数の一覧は付録の定数一覧の節を参照してください。それぞれの定数の使い方は戻り値の型の指定の節を参考にしてください。
+
-resultType: 評価の結果返してほしい値の型を示す定数です。もっともよく指定される定数は XPathResult.ANY_TYPE で、この場合、指定された XPath 式に対して一番適切な型で結果が返されます。指定できる定数の一覧は付録の定数一覧の節を参照してください。それぞれの定数の使い方は「返値の型の指定」の節を参考にしてください。result: 既存の XPathResult オブジェクトまたは null を指定します。 XPathResult オブジェクトが指定された場合には、そのオブジェクトが再利用されます。 null が指定された場合には新しい XPathResult オブジェクトが生成されます。戻り値
+返値
-resultType で指定された型の XPathResult オブジェクトを返します。XPathResult インターフェースはここで定義されています。xpathResult を返します。これは引数 resultType で指定された型の XPathResult オブジェクトです。XPathResult インターフェイスはここで定義されています。既定の名前空間リゾルバーの実装
-デフォルト名前空間リゾルバの実装
+createNSResolver メソッドを使います。createNSResolver メソッドを使います。var nsResolver = document.createNSResolver( contextNode.ownerDocument == null ? contextNode.documentElement : contextNode.ownerDocument.documentElement );
+
-var nsResolver = document.createNSResolver( contextNode.ownerDocument == null ? contextNode.documentElement : contextNode.ownerDocument.documentElement );
+
XPathEvaluator オブジェクトの createNSResolver メソッドを使います。var xpEvaluator = new XPathEvaluator();
+var nsResolver = xpEvaluator.createNSResolver( contextNode.ownerDocument == null ? contextNode.documentElement : contextNode.ownerDocument.documentElement );
-nsResolver を パラメータ namespaceResolver として document.evaluate に渡します。nsResolver を引数 namespaceResolver として document.evaluate に渡します。
注意すべきなのは、XPath では接頭辞のない QName は名前空間が null の要素にのみマッチすると定義されているという点です。XPath にはデフォルト名前空間を取得する手段はありません。名前空間が null ではない要素や属性にマッチさせるには、接頭辞付きの名前テストを使い、その接頭辞を名前空間にマッピングする名前空間リゾルバを作成する必要があります。詳しくは下記のユーザ定義の名前空間リゾルバを作成する方法を参照して下さい。
注: XPath では接頭辞のない QName は名前空間が null の要素にのみ一致すると定義しています。 XPath には、通常の要素参照に適用される既定の名前空間を取得する手段はありません。 (例: xmlns='http://www.w3.org/1999/xhtml' に対する p[@id='_myid'])。名前空間が null ではない既定の要素に一致させるには、 ['namespace-uri()='http://www.w3.org/1999/xhtml' and name()='p' and @id='_myid'] のような形を使用して特定の要素を参照するか (このアプローチは名前空間が不明である可能性のある動的な XPath で有効です)、接頭辞つきの名前テストを使用し、その接頭辞を名前空間にマッピングする名前空間リゾルバーを作成する必要があります。詳しくは下記のユーザー定義の名前空間リゾルバーを作成する方法を参照して下さい。
{{ 英語版章題("Specifying the Return Type") }}
+任意の DOM ノードを名前空間の解決に適応させると、 XPath 式が文書内に現れたノードのコンテキストに関連して簡単に評価できるようになります。このアダプターは、ノード上の DOM Level 3 メソッド lookupNamespaceURI と同様に動作し、 lookupNamespaceURI が呼び出された時点でノードの階層で利用可能な現在の情報を使用して、指定された接頭辞から namespaceURI を解決します。また、暗黙の xml 接頭辞も正しく解決します。
document.evaluate から返される変数 xpathResult は、単一のノード (単純型) もしくはノードのコレクション (ノード集合型) から成ります。
{{ 英語版章題("Simple Types") }}
+document.evaluate から返される変数 xpathResult は、単一のノード (単純型) もしくはノードのコレクション (ノード集合型) から成ります。
resultType で要求された結果型が次のうちのどれかであった場合、
BOOLEAN_TYPE - 真偽値それぞれ以下の XPathResult オブジェクトのプロパティにアクセスする事で式の戻り値を得る事ができます。
それぞれ以下の XPathResult オブジェクトのプロパティにアクセスすることで式の返値を得る事ができます。
numberValuebooleanValue{{ 英語版章題("Example") }}
- -下の例では XPath 式 count(//p) によって HTML 文書内の <p> 要素の数を取得しています。
下の例では XPath 式 count(//p) によって HTML 文書内の <p> 要素の数を取得しています。
var paragraphCount = document.evaluate( 'count(//p)', document, null, XPathResult.ANY_TYPE, null ); +-var paragraphCount = document.evaluate( 'count(//p)', document, null, XPathResult.ANY_TYPE, null ); alert( 'この文書には ' + paragraphCount.numberValue + ' 個の段落要素が含まれています' );-JavaScript では数値を表示しようとすると文字列に変換されますが、XPath インターフェイスは
+stringValueプロパティを要求しても数値の結果を自動的に変換しないので、下のコードは動作しません。JavaScript では数値を表示しようとすると文字列に変換されますが、 XPath インターフェイスは
-stringValueプロパティを要求しても数値の結果を自動的に変換しないので、下のコードは動作しません。var paragraphCount = document.evaluate('count(//p)', document, null, XPathResult.ANY_TYPE, null ); +var paragraphCount = document.evaluate('count(//p)', document, null, XPathResult.ANY_TYPE, null ); alert( 'この文書には ' + paragraphCount.stringValue + ' 個の段落要素が含まれています' );これを実行すると
-NS_DOM_TYPE_ERRORコードの例外が返されます。{{ 英語版章題("Node-Set Types") }}
- -ノード集合型
+ノード集合型
XPathResultオブジェクトが返すノード集合には主として 3 種類の型があります。
{{ 英語版章題("Iterators") }}
+パラメータ resultType で指定された結果型が次のどちらかの場合、
引数 resultType で指定された結果型が次のどちらかの場合、
UNORDERED_NODE_ITERATOR_TYPEORDERED_NODE_ITERATOR_TYPEマッチしたノードのノード集合がXPathResult オブジェクトとして返されます。これはイテレータのようにふるまい、 XPathResult の iterateNext() メソッドを使ってその中に含まれる個々のノードにアクセスできます。
一致したノードのノード集合が XPathResult オブジェクトとして返されます。これはイテレーターのようにふるまい、 XPathResult の iterateNext() メソッドを使ってその中に含まれる個々のノードにアクセスできます。
マッチしたノードに対する反復が全て終了すると、iterateNext() は null を返します。
一致したノードに対する反復が全て終了すると、 iterateNext() は null を返します。
ただし、反復処理中に文書が変異した (文書ツリーが改変された) 場合、反復処理は無効化され、XPathResult の invalidIteratorState プロパティが true に設定され、NS_ERROR_DOM_INVALID_STATE_ERR 例外が投げられます。
{{ 英語版章題("Iterator Example") }}
- -var iterator = document.evaluate('//phoneNumber', documentNode, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null );
+var iterator = document.evaluate('//phoneNumber', documentNode, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null );
try {
var thisNode = iterator.iterateNext();
@@ -167,95 +145,79 @@ try {
}
}
catch (e) {
- dump( 'Error: Document tree modified during iteraton ' + e );
+ alert( 'Error: Document tree modified during iteration ' + e );
}
-{{ 英語版章題("Snapshots") }}
-
-スナップショット
+スナップショット
-パラメータ resultType で指定された結果型が次のどちらかの場合、
+引数 resultType で指定された結果型が次のどちらかの場合、
UNORDERED_NODE_SNAPSHOT_TYPEORDERED_NODE_SNAPSHOT_TYPE返される XPathResult オブジェクトはマッチしたノードの静的なノード集合となり、XPathResult オブジェクトの snapshotItem(itemNumber) メソッドによってそれぞれのノードにアクセス出来ます。itemNumber は取り出すノードのインデックスです。含まれるノードの総数は snapshotLength プロパティから得られます。
返される XPathResult オブジェクトは一致したノードの静的な集合となり、 XPathResult オブジェクトの snapshotItem(itemNumber) メソッドによってそれぞれのノードにアクセスできます。itemNumber は取り出すノードのインデックスです。含まれるノードの総数は snapshotLength プロパティから得られます。
スナップショットは文書が変異しても変更されず、イテレータと違って無効になることはありませんが、スナップショットは現在の文書に対応しません。ノードが移動されていたり、既に存在しないノードが含まれていたり、新しいノードが追加されている可能性もあります。
+スナップショットは文書が変化しても変更されず、イテレーターと違って無効になることはありませんが、スナップショットは現在の文書に対応しないことがあります。ノードが移動されていたり、既に存在しないノードが含まれていたり、新しいノードが追加されている可能性もあります。
-{{ 英語版章題("Snapshot Example") }}
+var nodesSnapshot = document.evaluate('//phoneNumber', documentNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
+var nodesSnapshot = document.evaluate('//phoneNumber', documentNode, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
for ( var i=0 ; i < nodesSnapshot.snapshotLength; i++ )
{
- dump( nodesSnapshot.snapshotItem(i).textContent );
+ alert( nodesSnapshot.snapshotItem(i).textContent );
}
-{{ 英語版章題("First Node") }}
-
-ファーストノード
+ファーストノード
-パラメータ resultType で指定された結果型が次のどちらかの場合、
+引数 resultType で指定された結果型が次のどちらかの場合、
ANY_UNORDERED_NODE_TYPEFIRST_ORDERED_NODE_TYPEXPath 式にマッチした最初のノードのみが XPathResult オブジェクトとして返されます。このノードには XPathResult オブジェクトの singleNodeValue プロパティによってアクセスできます。ノード集合が空ならばこのプロパティは null になります。
ただし、ordered サブタイプの場合は文書順において最初にマッチしたノードであることが保証されますが、unordered サブタイプの場合、返される単一のノードは文書順において最初のものではない可能性があるので注意が必要です。
+返される XPathResult オブジェクトは XPath 式に一致するノードのうち最初に見つかったもののみです。このノードには XPathResult オブジェクトの singleNodeValue プロパティによってアクセスできます。ノード集合が空ならばこのプロパティは null になります。
{{ 英語版章題("First Node Example") }}
+ただし、 unordered サブタイプの場合、返される単一のノードは文書順において最初のものではない可能性があるので注意が必要です。 ordered サブタイプの場合は文書順において最初に一致するノードであることが保証されます。
-var firstPhoneNumber = document.evaluate('//phoneNumber', documentNode, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null );
+var firstPhoneNumber = document.evaluate('//phoneNumber', documentNode, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null );
-dump( 'The first phone number found is ' + firstPhoneNumber.singleNodeValue.textContent );
+alert( 'The first phone number found is ' + firstPhoneNumber.singleNodeValue.textContent );
-{{ 英語版章題("The ANY_TYPE Constant") }}
+ANY_TYPE 定数
-ANY_TYPE 定数
+引数 resultType に指定された結果型が ANY_TYPE である場合、返される XPathResult オブジェクトは、式を評価した結果から導き出される適切な型になります。
-パラメータ resultType に指定された結果型が ANY_TYPE である場合、返される XPathResult オブジェクトは、式を評価した結果から導き出される適切な型になります。
+返される結果型は単純型 (NUMBER_TYPE, STRING_TYPE, BOOLEAN_TYPE ) のうちのいずれにもなり得ますが、もしノード集合であった場合には、UNORDERED_NODE_ITERATOR_TYPE にしかなり得ません。
-返される結果型は単純型 ( NUMBER_TYPE, STRING_TYPE, BOOLEAN_TYPE ) のうちのいずれにもなり得ますが、もしノード集合であった場合には、UNORDERED_NODE_ITERATOR_TYPE にしかなり得ません。
+評価の後に型を判断するには、 XPathResult オブジェクトの resultType プロパティを使います。このプロパティの定数値は付録に記載されています。 None Yet =====Any_Type Example===== <pre> </pre>
-評価の後に型を判断するには、XPathResult オブジェクトの resultType プロパティを使います。このプロパティの定数値は付録に記載されています。 None Yet {{ 英語版章題("Any_Type Example") }}
+例
-Any_Type Example
-
-{{ 英語版章題("Examples") }}
-
-例
-
-{{ 英語版章題("Within a HTML Document") }}
-
-HTML 文書内で
+HTML 文書内で
下のコードは、 XPath 式を評価する対象となる HTML 文書の内部や、それにリンクされた JavaScript 内に設置するためのものです。
-XPath を使って HTML 文書内の全ての <h2> 見出し要素を抽出したければ、xpathExpression は単に '//h2' となります。 // は再帰下降演算子 (Recursive Descent Operator)なので、この式は文書ツリー内のあらゆる位置にある、nodeName が h2 である要素にマッチします。 link to introductory xpath doc
+XPath を使って HTML 文書内のすべての <h2> 見出し要素を抽出したければ、xpathExpression は単に '//h2' となります。 // は再帰下降演算子 (Recursive Descent Operator) なので、この式は文書ツリー内のあらゆる位置にある、nodeName が h2 である要素に一致します。 link to introductory xpath doc
-var headings = document.evaluate('//h2', document, null, XPathResult.ANY_TYPE, null );
+var headings = document.evaluate('//h2', document, null, XPathResult.ANY_TYPE, null );
-HTML は名前空間を持っていないため、パラメータ namespaceResolver には null を渡している事に注目してください。
+HTML には名前空間がないため、引数 namespaceResolver には null を渡している事に注目してください。
-文書全体から見出し要素を探すため、ここでは document オブジェクト自体を contextNode として使っています。
+文書全体から見出し要素を探すため、ここでは document オブジェクト自体を contextNode として使っています。
-この式の結果は XPathResult オブジェクトです。返された結果の型を知りたければ、返されたオブジェクトの resultType プロパティを評価します。この場合は 4 、つまり UNORDERED_NODE_ITERATOR_TYPE と評価されるでしょう。これは XPath 式の結果がノード集合であった場合のデフォルトの結果型です。この型はノードに一つずつアクセスする事ができ、返されるノードの順序は決まっていません。返されたノードにアクセスするには、返されたオブジェクトの iterateNext() メソッドを使います。
+この式の結果は XPathResult オブジェクトです。返された結果の型を知りたい場合は、返されたオブジェクトの resultType プロパティを評価してください。この場合は 4 、つまり UNORDERED_NODE_ITERATOR_TYPE と評価されるでしょう。これは XPath 式の結果がノード集合であった場合の既定の結果型です。この型はノードに一つずつアクセスすることができ、返されるノードの順序は決まっていません。返されたノードにアクセスするには、返されたオブジェクトの iterateNext() メソッドを使います。
-var thisHeading = headings.iterateNext();
+var thisHeading = headings.iterateNext();
var alertText = 'この文書内のレベル 2 の見出しは、\n'
@@ -265,15 +227,15 @@ while (thisHeading) {
}
-反復によってノードを得られれば、そのノードの全ての標準 DOM インターフェイスにアクセスできます。式によって返される h2 要素に対する反復処理が全て終了すると、それ以降は iterateNext() を何度呼び出しても null が返されます。
+反復によってノードを得られたら、そのノードのすべての標準 DOM インターフェイスにアクセスできます。式によって返される h2 要素に対する反復処理が全て終了すると、それ以降は iterateNext() を何度呼び出しても null が返されます。
{{ 英語版章題("Evaluating against an XML document within an Extension") }}
-拡張機能内の XML 文書に対して評価する
+拡張機能内の XML 文書に対して評価する
-例として XML 文書が chrome://yourextension/content/peopleDB.xml にあるとします。
+例として XML 文書が chrome://yourextension/content/peopleDB.xml にあったとします。
-<?xml version="1.0"?>
+<?xml version="1.0"?>
<people xmlns:xul = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" >
<person>
<name first="george" last="bush" />
@@ -292,7 +254,7 @@ while (thisHeading) {
拡張機能の xul/js 文書で使用する JavaScript は以下の通りです。
-var req = new XMLHttpRequest();
+var req = new XMLHttpRequest();
req.open("GET", "chrome://yourextension/content/peopleDB.xml", false);
req.send(null);
@@ -304,24 +266,26 @@ var nsResolver = xmlDoc.createNSResolver( xmlDoc.ownerDocument == null ? xmlDoc
var personIterator = xmlDoc.evaluate('//person', xmlDoc, nsResolver, XPathResult.ANY_TYPE, null );
-{{ 英語版章題("Appendix") }}
+注
+
+XPathResult オブジェクトが定義されていない場合は、 Components.interfaces.nsIDOMXPathResult.ANY_TYPE (CI.nsIDOMXPathResult) を使用して、特権的なコードで定数を取得できます。同様に、 XPathEvaluator は次のようにして作成できます。
-付録
+Components.classes["@mozilla.org/dom/xpath-evaluator;1"].createInstance(Components.interfaces.nsIDOMXPathEvaluator)
-{{ 英語版章題("Implementing a User Defined Namespace Resolver") }}
+付録
-ユーザ定義の名前空間リゾルバの実装
+ユーザー定義の名前空間リゾルバーの実装
この例は説明のためだけのものです。 この関数は、xpathExpression から名前空間接頭辞を取り、その接頭辞に対応する URI を返さなければなりません。例えば、この式は、
'//xhtml:td/mathml:math'
-(X)HTML のテーブルデータセル要素の子要素である全ての MathML 式を選択します。
+(X)HTML のテーブルデータセル要素の子要素である全ての MathML 式を選択します。
-接頭辞 'mathml:' と 名前空間 URI 'http://www.w3.org/1998/Math/MathML' を、接頭辞 'xhtml:' と URI 'http://www.w3.org/1999/xhtml' をそれぞれ関連付けるため、関数を用意します。
+接頭辞 'mathml:' と 名前空間 URI 'http://www.w3.org/1998/Math/MathML' を、接頭辞 'xhtml:' と URI 'http://www.w3.org/1999/xhtml' をそれぞれ関連付けるため、関数を用意します。
-function nsResolver(prefix) {
+function nsResolver(prefix) {
var ns = {
'xhtml' : 'http://www.w3.org/1999/xhtml',
'mathml': 'http://www.w3.org/1998/Math/MathML'
@@ -332,16 +296,14 @@ var personIterator = xmlDoc.evaluate('//person', xmlDoc, nsResolver, XPathResult
そうすると document.evaluate をこのようにして呼び出せます。
-document.evaluate( '//xhtml:td/mathml:math', document, nsResolver, XPathResult.ANY_TYPE, null );
+document.evaluate( '//xhtml:td/mathml:math', document, nsResolver, XPathResult.ANY_TYPE, null );
-{{ 英語版章題("Implementing a default namespace for XML documents") }}
-
-XML 文書のデフォルト名前空間を実装する
+XML 文書の既定の名前空間を実装する
-デフォルト名前空間リゾルバの実装で述べたように、デフォルトリゾルバは XML 文書のデフォルト名前空間を処理しません。たとえばこの文書では、
+既定の名前空間リゾルバーの実装で述べたように、既定のリゾルバーは XML 文書の既定の名前空間を処理しません。たとえばこの文書では、
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<entry />
<entry />
@@ -349,29 +311,52 @@ var personIterator = xmlDoc.evaluate('//person', xmlDoc, nsResolver, XPathResult
</feed>
-doc.evaluate('//entry', doc, nsResolver, XPathResult.ANY_TYPE, null) は、nsResolver が createNSResolver によって返されたリゾルバである場合、空集合を返します。リゾルバとして null を渡しても同じです。
+doc.evaluate('//entry', doc, nsResolver, XPathResult.ANY_TYPE, null) は、nsResolver が createNSResolver によって返されたリゾルバーである場合、空集合を返します。リゾルバーとして null を渡しても同じです。
-正しいデフォルト名前空間 (この場合は Atom 名前空間) を返すカスタムリゾルバを作成すれば、この問題を解決できます。この時、XPath 式の中ではなんらかの名前空間接頭辞を使わなければならないことに注意してください。これはリゾルバ関数がその接頭辞を指定した名前空間に変換できるようにするためです。例えばこのようにします。
+正しい既定の名前空間 (この場合は Atom 名前空間) を返すカスタムリゾルバーを作成すれば、この問題を解決できます。この時、 XPath 式の中ではなんらかの名前空間接頭辞を使わなければならないことに注意してください。これはリゾルバー関数がその接頭辞を指定した名前空間に変換できるようにするためです。例えばこのようにします。
-function resolver() {
+function resolver() {
return 'http://www.w3.org/2005/Atom';
}
doc.evaluate('//myns:entry', doc, resolver, XPathResult.ANY_TYPE, null)
-文書で複数の名前空間が使われている場合には、より複雑なリゾルバが必要になります。
+なお、文書で複数の名前空間が使われている場合には、より複雑なリゾルバーが必要になります。
+
+次の節では、より効果的に機能する (名前空間を事前に知らなくてもよい) アプローチについて説明します。
+
+XPath 関数を使用して既定の名前空間の要素を参照する
+
+null ではない名前空間の既定の要素に一致させる (そして名前空間が分からない動的な XPath 式で上手く動作する) もう一つの方法として、 [namespace-uri()='http://www.w3.org/1999/xhtml' and name()='p' and @id='_myid'] のような形式で特定の要素を参照する方法があります。これにより、XPath クエリーが正規にラベル付けされた要素の既定の名前空間を検出できないという問題が回避されます。
+
+接頭辞に関係ない、名前空間付きの要素や属性の取得
+
+名前空間の要素や属性を見つける際に特定の接頭辞を必ずしも必要とせず、 (意図的に) 名前空間に柔軟性を持たせたい場合は、特別な手法を用いなければなりません。
+
+上の節のアプローチを応用して、選択された接頭辞に関係なく名前空間の要素をテストすることは (local-name() と namespace-uri() を組み合わせて name() の代わりに使用すれば) 可能ですが、特定の名前空間属性を持つ要素を述語の中に取り込みたい場合には、より困難な状況が発生します (XPath 1.0 には実装に依存しない変数が存在しないため)。
-{{ 英語版章題("XPathResult Defined Constants") }}
+たとえば、次のように namespaced 属性を持つ要素を取得しようとすると、 (間違って) var xpathlink = someElements[local-name(@*)="href" and namespace-uri(@*)='http://www.w3.org/1999/xlink']; となります。
-XPathResult の定義済み定数
+この方法では、ローカル名が "href" である属性が存在しても、その属性が (@href ではなく) 対象となる (XLink) 名前空間を持つ別の属性であった場合、誤って一部の要素を取得してしまう可能性があります。
+
+XLink の @href 属性を持つ要素を (名前空間リゾルバーで定義済みの接頭辞にとらわれずに) 正確に把握するためには、次のようにして取得することができます。
+
+var xpathEls = 'someElements[@*[local-name() = "href" and namespace-uri() = "http://www.w3.org/1999/xlink"]]'; // Grabs elements with any single attribute that has both the local name 'href' and the XLink namespace
+var thislevel = xml.evaluate(xpathEls, xml, null, XPathResult.ANY_TYPE, null);
+var thisitemEl = thislevel.iterateNext();
+
+
+XPathResult の定義済み定数
| 定義済みの結果型定数 | 値 | 解説 | |
| ANY_TYPE | 0 | @@ -395,43 +380,48 @@ doc.evaluate('//myns:entry', doc, resolver, XPathResult.ANY_TYPE, null)||
| UNORDERED_NODE_ITERATOR_TYPE | 4 | -式にマッチした全てのノードを格納した結果ノード集合。ノードの順番は文書内に現れる順番と必ずしも一致しない。 | +一致した全てのノードを格納した結果ノード集合。ノードの順番は文書内に現れる順番と必ずしも一致しない。 |
| ORDERED_NODE_ITERATOR_TYPE | 5 | -式にマッチした全てのノードを格納した結果ノード集合。ノードの順番は文書内に現れる順番に一致する。 | +|
| UNORDERED_NODE_SNAPSHOT_TYPE | 6 | -式にマッチした全てのノードのスナップショットを格納した結果ノード集合。ノードの順番は文書内に現れる順番と必ずしも一致しない。 | +一致した全てのノードのスナップショットを格納した結果ノード集合。ノードの順番は文書内に現れる順番と必ずしも一致しない。 |
| ORDERED_NODE_SNAPSHOT_TYPE | 7 | -式にマッチした全てのノードのスナップショットを格納した結果ノード集合。ノードの順番は文書内に現れる順番に一致する。 | +一致した全てのノードのスナップショットを格納した結果ノード集合。ノードの順番は文書内に現れる順番に一致する。 |
| ANY_UNORDERED_NODE_TYPE | 8 | -式にマッチしたノードのうちのどれか一つを格納した結果ノード集合。これは必ずしも文書内で式にマッチした最初のノードというわけではない。 | +一致したノードのうちのどれか一つを格納した結果ノード集合。これは必ずしも文書内で式に一致した最初のノードというわけではない。 |
| FIRST_ORDERED_NODE_TYPE | 9 | -文書内で式にマッチした最初のノードを格納した結果ノード集合。 | +一致内で式に一致した最初のノードを格納した結果ノード集合。 |
{{ 英語版章題("Original Document Information") }}
+