diff --git a/files/ja/web/xpath/introduction_to_using_xpath_in_javascript/index.md b/files/ja/web/xpath/introduction_to_using_xpath_in_javascript/index.md index 4d988c147aa168..2205d4c78d99cf 100644 --- a/files/ja/web/xpath/introduction_to_using_xpath_in_javascript/index.md +++ b/files/ja/web/xpath/introduction_to_using_xpath_in_javascript/index.md @@ -1,18 +1,22 @@ --- title: JavaScript での XPath の利用の手引き slug: Web/XPath/Introduction_to_using_XPath_in_JavaScript +l10n: + sourceCommit: b6f343538eac4a803943b4e99b0c0545b372645a --- -この文書では、拡張機能やウェブサイトから JavaScript 内で [XPath](/ja/docs/Web/XPath) を使うためのインターフェイスについて解説します。 Mozilla は [DOM 3 XPath](https://www.w3.org/TR/DOM-Level-3-XPath/xpath.html) のかなりの部分を実装しており、 HTML 文書と XML 文書のどちらに対しても XPath 式を実行することができます。 +{{XsltSidebar}} + +この文書では、拡張機能やウェブサイトから JavaScript 内で [XPath](/ja/docs/Web/XPath) を使うためのインターフェイスについて解説します。 Mozilla は [DOM 3 XPath](https://www.w3.org/TR/2004/NOTE-DOM-Level-3-XPath-20040226/) のかなりの部分を実装しており、 HTML 文書と XML 文書のどちらに対しても XPath 式を実行することができます。 XPath を使用するための主となるインターフェイスは [document](/ja/docs/Web/API/Document) オブジェクトの [evaluate](/ja/docs/Web/API/Document/evaluate) 関数です。 -## document.evaluate +## document.evaluate() このメソッドは [XPath](/ja/docs/Web/XPath) 式を [XML](/ja/docs/Glossary/XML) ベースの文書 ( HTML を含む) に対して評価し、 [`XPathResult`](/ja/docs/Web/API/XPathResult) オブジェクトを返します。これは単一のノード、もしくはノードの集合になります。このメソッドの既存のドキュメントは [document.evaluate](/ja/docs/Web/API/Document/evaluate) ですが、このメソッドの解説のためには内容が薄いため、以下でさらに詳しく説明します。 ```js -var xpathResult = document.evaluate( +const xpathResult = document.evaluate( xpathExpression, contextNode, namespaceResolver, @@ -23,7 +27,7 @@ var xpathResult = document.evaluate( ### 引数 -[evaluate](/ja/docs/Web/API/Document/evaluate) 関数は 5 つの引数を取ります。 +[`evaluate()`](/ja/docs/Web/API/Document/evaluate) 関数は 5 つの引数を取ります。 - `xpathExpression`: 評価する XPath 式を文字列で指定します。 - `contextNode`: `xpathExpression` を評価する対象となる文書内のノードを指定します。指定されたノードの全ての子ノードに対しても評価が行われます。もっともよく使用される値は [document](/ja/docs/Web/API/Document) ノードです。 @@ -45,8 +49,8 @@ var xpathResult = document.evaluate( 名前空間リゾルバーを作成するには、普通は [document](/ja/docs/Web/API/Document) オブジェクトの `createNSResolver` メソッドを使います。 ```js -var nsResolver = document.createNSResolver( - contextNode.ownerDocument == null +const nsResolver = document.createNSResolver( + contextNode.ownerDocument === null ? contextNode.documentElement : contextNode.ownerDocument.documentElement, ); @@ -55,9 +59,9 @@ var nsResolver = document.createNSResolver( または、 `XPathEvaluator` オブジェクトの `createNSResolver` メソッドを使います。 ```js -var xpEvaluator = new XPathEvaluator(); -var nsResolver = xpEvaluator.createNSResolver( - contextNode.ownerDocument == null +const xpEvaluator = new XPathEvaluator(); +const nsResolver = xpEvaluator.createNSResolver( + contextNode.ownerDocument === null ? contextNode.documentElement : contextNode.ownerDocument.documentElement, ); @@ -65,15 +69,15 @@ var nsResolver = xpEvaluator.createNSResolver( それから 変数 `nsResolver` を引数 `namespaceResolver` として `document.evaluate` に渡します。 -注: 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']` のような形を使用して特定の要素を参照するか ([このアプローチ](#using_xpath_functions_to_reference_elements_with_a_default_namespace)は名前空間が不明である可能性のある動的な XPath で有効です)、接頭辞つきの名前テストを使用し、その接頭辞を名前空間にマッピングする名前空間リゾルバーを作成する必要があります。詳しくは下記の[ユーザー定義の名前空間リゾルバーを作成する](#ユーザー定義の名前空間リゾルバーの実装)方法を参照して下さい。 +メモ: 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_関数を使用して既定の名前空間の要素を参照する)は名前空間が不明である可能性のある動的な XPath で有効です)、接頭辞つきの名前テストを使用し、その接頭辞を名前空間にマッピングする名前空間リゾルバーを作成する必要があります。詳しくは下記の[ユーザー定義の名前空間リゾルバーを作成する](#ユーザー定義の名前空間リゾルバーの実装)方法を参照して下さい。 -### 注 +### メモ 任意の DOM ノードを名前空間の解決に適応させると、 [XPath](/ja/docs/Web/XPath) 式が文書内に現れたノードのコンテキストに関連して簡単に評価できるようになります。このアダプターは、ノード上の DOM Level 3 メソッド `lookupNamespaceURI` と同様に動作し、 `lookupNamespaceURI` が呼び出された時点でノードの階層で利用可能な現在の情報を使用して、指定された接頭辞から `namespaceURI` を解決します。また、暗黙の `xml` 接頭辞も正しく解決します。 ### 返値の型の指定 -`document.evaluate` から返される変数 `xpathResult` は、単一のノード ([単純型](#simple_types)) もしくはノードのコレクション ([ノード集合型](#node-set_types)) から成ります。 +`document.evaluate` から返される変数 `xpathResult` は、単一のノード([単純型](#単純型))もしくはノードのコレクション([ノード集合型](#ノード集合型))から成ります。 #### 単純型 @@ -94,7 +98,7 @@ var nsResolver = xpEvaluator.createNSResolver( 下の例では XPath 式 [`count(//p)`](/ja/docs/Web/XPath/Functions/count) によって HTML 文書内の `
` 要素の数を取得しています。 ```js -var paragraphCount = document.evaluate( +const paragraphCount = document.evaluate( "count(//p)", document, null, @@ -102,17 +106,15 @@ var paragraphCount = document.evaluate( null, ); -alert( - "この文書には " + - paragraphCount.numberValue + - " 個の段落要素が含まれています", +console.log( + `この文書には ${paragraphCount.numberValue} 個の段落要素が含まれています`, ); ``` JavaScript では数値を表示しようとすると文字列に変換されますが、 XPath インターフェイスは `stringValue` プロパティを要求しても数値の結果を自動的に変換しないので、下のコードは**動作しません**。 ```js -var paragraphCount = document.evaluate( +const paragraphCount = document.evaluate( "count(//p)", document, null, @@ -120,10 +122,8 @@ var paragraphCount = document.evaluate( null, ); -alert( - "この文書には " + - paragraphCount.stringValue + - " 個の段落要素が含まれています", +console.log( + `この文書には ${paragraphCount.stringValue} 個の段落要素が含まれています`, ); ``` @@ -133,9 +133,9 @@ alert( `XPathResult` オブジェクトが返すノード集合には主として 3 種類の型があります。 -- [イテレーター](#iterators) -- [スナップショット](#snapshots) -- [ファーストノード](#first_node) +- [イテレーター](#イテレーター) +- [スナップショット](#スナップショット) +- [ファーストノード](#ファーストノード) ##### イテレーター @@ -151,7 +151,7 @@ alert( ただし、反復処理中に文書が変異した (文書ツリーが改変された) 場合、反復処理は無効化され、`XPathResult` の `invalidIteratorState` プロパティが `true` に設定され、`NS_ERROR_DOM_INVALID_STATE_ERR` 例外が投げられます。 ```js -var iterator = document.evaluate( +const iterator = document.evaluate( "//phoneNumber", documentNode, null, @@ -160,14 +160,14 @@ var iterator = document.evaluate( ); try { - var thisNode = iterator.iterateNext(); + let thisNode = iterator.iterateNext(); while (thisNode) { - alert(thisNode.textContent); + console.log(thisNode.textContent); thisNode = iterator.iterateNext(); } } catch (e) { - alert("Error: Document tree modified during iteration " + e); + console.error(`Error: Document tree modified during iteration ${e}`); } ``` @@ -183,7 +183,7 @@ try { スナップショットは文書が変化しても変更されず、イテレーターと違って無効になることはありませんが、スナップショットは現在の文書に対応しないことがあります。ノードが移動されていたり、既に存在しないノードが含まれていたり、新しいノードが追加されている可能性もあります。 ```js -var nodesSnapshot = document.evaluate( +const nodesSnapshot = document.evaluate( "//phoneNumber", documentNode, null, @@ -191,8 +191,8 @@ var nodesSnapshot = document.evaluate( null, ); -for (var i = 0; i < nodesSnapshot.snapshotLength; i++) { - alert(nodesSnapshot.snapshotItem(i).textContent); +for (let i = 0; i < nodesSnapshot.snapshotLength; i++) { + console.log(nodesSnapshot.snapshotItem(i).textContent); } ``` @@ -208,7 +208,7 @@ for (var i = 0; i < nodesSnapshot.snapshotLength; i++) { ただし、 unordered サブタイプの場合、返される単一のノードは文書順において最初のものではない可能性があるので注意が必要です。 ordered サブタイプの場合は文書順において最初に一致するノードであることが保証されます。 ```js -var firstPhoneNumber = document.evaluate( +const firstPhoneNumber = document.evaluate( "//phoneNumber", documentNode, null, @@ -216,9 +216,8 @@ var firstPhoneNumber = document.evaluate( null, ); -alert( - "The first phone number found is " + - firstPhoneNumber.singleNodeValue.textContent, +console.log( + `The first phone number found is ${firstPhoneNumber.singleNodeValue.textContent}`, ); ``` @@ -228,7 +227,7 @@ alert( 返される結果型は単純型 (`NUMBER_TYPE`, `STRING_TYPE`, `BOOLEAN_TYPE`) のうちのいずれにもなり得ます**が**、もしノード集合であった場合には、`UNORDERED_NODE_ITERATOR_TYPE` に**しか**なり得ません。 -評価の後に型を判断するには、 `XPathResult` オブジェクトの `resultType` プロパティを使います。このプロパティの[定数](#xpathresult_の定義済み定数)値は付録に記載されています。 None Yet =====Any_Type Example===== \
\+評価の後に型を判断するには、 `XPathResult` オブジェクトの `resultType` プロパティを使います。このプロパティの[定数](#xpathresult_の定義済み定数)値は付録に記載されています。 ## 例 @@ -239,7 +238,7 @@ alert( XPath を使って HTML 文書内のすべての `