

Firefoxのウェブコンソール上で

[code]

    <h1><span class='A'>テキスト1</span><span>テキスト2</span></h1>
    
[/code]

なる形の`h1`要素に対し、

[code]

    document.evaluate("span[@class='A']|.", <h1要素をあらわすノード>, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.innerText
    
[/code]

と呼び出したところ、

[code]

    "テキスト1テキスト2"
    
[/code]

というテキストが得られました。これは`span[@class='A']`ではなく`.`が[文書順](https://developer.mozilla.org/ja/docs/Introduction_to_using_XPath_in_JavaScript#First_Node)で先に来るノードにマッチするから（外側のノードが文書順では先だから）と考えて良いのでしょうか？

また、文書順に関わらずに`xpath1`にマッチするノードを優先し、そのようなノードが存在しない場合に`xpath2`にマッチするノードを返す、ということを単一のXPathで実現できるのでしょうか？  
（上に書いた通り`xpath1 | xpath2`とするだけではダメでした。集合を返すので当然と言えば当然ですが）


CC BY-SA 3.0
2017-08-16T04:30:24.400
37240
2021-08-12T06:44:35.367
13199
question
javascript xpath
返されるノードの優先順位について


こんなところでしょうか。

[code]

    'use strict';
    /**
     * 先にマッチしたh1要素ノード(コンテキストノード)を得る
     */
    var h1 = document.evaluate("span[@class='A']|.", document.querySelector('h1'), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    console.log(h1);  // <h1><span class='A'>テキスト1</span><span>テキスト2</span></h1>
    
    /**
     * ルートノード(コンテキストノード)を除く要素ノードを得る
     */
    var span = document.evaluate("span[@class='A']|descendant::*", document.querySelector('h1'), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    console.log(span);  // <span class='A'>テキスト1</span>
    
    /**
     * 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);  // <span class='A'>テキスト1</span>
[/code]

[code]

    <h1><span class='A'>テキスト1</span><span>テキスト2</span></h1>
[/code]


CC BY-SA 3.0
2017-08-16T05:28:23.293
37242
2017-08-16T05:36:13.027
2017-08-16T05:36:13.027
20262
20262
37240
answer


`xpath1 | xpath2[not(xpath1)]` ではどうでしょうか。

（XPath 2.0 以降で、`xpath1`, `xpath2` ともに単一ノードなら、`(xpath1, xpath2)[1]` が標準的ですが。）


CC BY-SA 4.0
2021-08-12T06:44:35.367
80743
2021-08-12T06:44:35.367
47682
37240
answer