none
XPath で、並列なノードリストの間から 特定の範囲を取り出せますか? RRS feed

  • 質問

  • XSLT で XML ドキュメントの加工をしたいのですが、XPath でのノード選択でつまづいています。

    特定の要素の間のノードリストを取り出したいのですが…
    例えば、

    <div>
    <a name="section1">...</a>
    <p>...</p><p>...</p><span>...</span>
    <hr />
    <a name="section2">...</a>
    <p>...</p>...</span>
    <hr />
        …
    </div>

    …で、a[@name='section2'] から a[@name='section3'] までの間を取り出したいと思っています。
    following-sibling だと最後尾まで返されてしまうので、次の要素まで範囲を狭める方法はないでしょうか?

    ご存知の方いらっしゃいましたら、教えていただけないでしょうか。

    2015年7月2日 19:42

すべての返信

  • こんにちは。

    section2からsection3というルールはどのように指定するつもりですか。
    少なくともsibling系で指定できないと思います。

    階層としても親子関係はなく、ただ並列に並べられているだけなので
    テンプレートを再帰適用していき、senction2~section3の間だけ再帰するように適用元でパラメータ指定すれば少なくとも実現は可能だと思います。
    ※もう少しスマートな方法があれば良いですが。

    2015年7月3日 0:22
    モデレータ
  • a[@name='section2'] から a[@name='section3'] までの間を取り出したいと思っています。
    following-sibling だと最後尾まで返されてしまうので、次の要素まで範囲を狭める方法はないでしょうか?

    質問が曖昧ですが、意図を読み取りますと section2 を取り出し、section1以前およびsection3以降は不要ということでしょうか?

    []で条件をうまく絞り込めばできます。例えば

    //div/*[(following-sibling::a[@name='section3']) and not (following-sibling::a[@name='section2'])]

    とか。(div下の要素で「以降にsection3を含み」かつ「以降にsection2を含まない」要素)


    • 編集済み 佐祐理 2015年7月3日 1:03
    • 回答の候補に設定 佐祐理 2015年7月6日 14:51
    2015年7月3日 1:02
  • Nifty the Slug さん、こんにちは。フォーラム オペレーターの星 睦美です。

    Nifty the Slug さんからの返信がありませんが、問題を検討する手がかりになったのではないかと思います。もし疑問な点がありましたらこちらのスレッドへの返信をお待ちしています。フォーラム ユーザーからの回答がお役にたちましたら投稿者からの[回答としてマーク] をお願いします。

    それではこれからもMSDN フォーラムをお役立てください。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2015年7月13日 1:03