質問: Firefoxのウェブコンソール上で ``` テキスト1テキスト2 ``` なる形の`h1`要素に対し、 ``` document.evaluate("span[@class='A']|.", , null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.innerText ``` と呼び出したところ、 ``` "テキスト1テキスト2" ``` というテキストが得られました。これは`span@class='A']`ではなく`.`が[文書順で先に来るノードにマッチするから(外側のノードが文書順では先だから)と考えて良いのでしょうか? また、文書順に関わらずに`xpath1`にマッチするノードを優先し、そのようなノードが存在しない場合に`xpath2`にマッチするノードを返す、ということを単一のXPathで実現できるのでしょうか? (上に書いた通り`xpath1 | xpath2`とするだけではダメでした。集合を返すので当然と言えば当然ですが)
回答: こんなところでしょうか。 ``` 'use strict'; /** * 先にマッチしたh1要素ノード(コンテキストノード)を得る */ var h1 = document.evaluate("span[@class='A']|.", document.querySelector('h1'), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; console.log(h1); // テキスト1テキスト2 /** * ルートノード(コンテキストノード)を除く要素ノードを得る */ var span = document.evaluate("span[@class='A']|descendant::*", document.querySelector('h1'), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; console.log(span); // テキスト1 /** * span[@class='A'] にマッチしなかったら、. */ var node = document.evaluate("span[@class='A']", document.querySelector('h1'), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; if (!node) { node = document.evaluate(".", document.querySelector('h1'), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; } console.log(node); // テキスト1 ``` ``` テキスト1テキスト2 ```