

初めまして。質問させて頂きます。  
XML+XSLTでプログラミング中です。

次のようなXMLがあるとします。

[code]

    <DATA>
        <F1>あ</F1>
        <F2>い</F2>
        <F3>う</F3>
        <F4>え</F4>
        <F5>お</F5>
        <F1>か</F1>
        <F2>き</F2>
        <F3>く</F3>
        <F4>け</F4>
        <F5>こ</F5>
        <F1>さ</F1>
        <F2>し</F2>
        <F3>す</F3>
        <F4>せ</F4>
        <F5>そ</F5>
    </DATA>
    
[/code]

この中で、`F1='か'`の下の`F3`のデータ(この場合は`く`)のみを取得するxpathの書き方が解らず悩んでおります。  
どなたかお分かりになる方が居られましたら、ご教示お願いできますでしょうか？  
宜しくお願いいたします。


CC BY-SA 3.0
2017-02-14T15:04:11.553
32672
2017-02-15T13:33:03.843
2017-02-14T19:18:19.207
3068
20662
question
xsl xpath
XMLのデータをXSLで取得したい


考え方としては

  1. `//F1` : すべての`F1`要素
  2. `[text()='か']` : …のうちテキストが`か`であるもの
  3. `/following-sibling::F3` : …と同階層で後ろにあるすべての`F3`要素
  4. `/text()` : …のテキスト

を繋げて以下のようになります。

[code]

    //F1[text()='か']/following-sibling::F3/text()
    
[/code]


CC BY-SA 3.0
2017-02-14T16:14:47.757
32673
2017-02-14T16:14:47.757
5750
32672
answer


もし@user20662さんがWindows + MSXMLのようなXPath
1.0の世界でこの質問をされておられるようでしたら、@pghoさんの回答でもよいと思われます．しかし世の中はすでにXPath
3.0まで進んでいるので、やはり最低でもXPath 2.0ではどうなるか？は知っておいて損はないでしょう．

@sayuriさんの御指摘のように、`//F1[text()='か']/following-sibling::F3/text()`をXPath
2.0で使用すると以下の様に２つのテキストノードが選択されてしまいます．（oXygen
18.1で試しています）従って使用するXpathのバージョンが上がっても確実に動作するようにしておくには、`//F1[text()='か']/following-
sibling::F3[1]/text()`のように書いておくのが確実です．

[![Xpath
2.0での実行結果](https://i.stack.imgur.com/CoEAb.png)](https://i.stack.imgur.com/CoEAb.png)

もしXpath 2.0以上を使用するならば、`string(/DATA/F1[string(.) eq 'か']/following-
sibling::F3[1])`くらいが適当ではないでしょうか？

  * "く"を取得するのはtext()を返すよりxs:stringを返す方が適切と思います．（実際XPath 2.0を使用するXSLTスタイルシートでas="text()"のように使うことはまずないからです．
  * シーケンスを比較する一般比較演算子"="でなく、文字列比較を明示して値比較演算子"eq"を使用します．

結果は次のように"く"が値として返るようになります．

[![Xpath
2.0での記述](https://i.stack.imgur.com/FaQFY.png)](https://i.stack.imgur.com/FaQFY.png)

以上 御参考になれば


CC BY-SA 3.0
2017-02-15T13:19:47.067
32689
2017-02-15T13:33:03.843
2020-06-17T08:14:45.997
-1
9503
32672
answer