2

xpath1.0を使用して2つの異なるノードで2つの基準を使用してxml内の値を見つける必要があります

例を挙げて説明しようと思います:次のxmlがある場合

<root>
<obj>
    <index>5</index>
    <datalist>
        <data>
            <code>X</code>
            <value>AAA</value>
        </data>
        <data>
            <code>Y</code>
            <value>BBB</value>
        </data>
    </datalist>
</obj>
<obj>
    <index>3</index>
    <datalist>
        <data>
            <code>Z</code>
            <value>CCC</value>
        </data>
    </datalist>
</obj>
<obj>
    <index>4</index>
    <datalist>
        <data>
            <code>X</code>
            <value>DDD</value>
        </data>
    </datalist>
</obj>
<obj>
    <index>2</index>
    <datalist>
        <data>
            <code>Y</code>
            <value>EEE</value>
        </data>
    </datalist>
</obj>

最小でwith内のwith<value><obj/data>取得<code=X>したいと思います(私たちの例では、結果としてDDDがあります)。<obj><index>

次の式を試しましたが、うまくいきません。

/root/obj[datalist/data/code='X'][not(preceding-sibling::obj/index <= index)
and not(following-sibling::obj/index <= index)]/datalist/data/value

しかし、それは機能しません

4

1 に答える 1

5

これをじっと見つめた後、私は何が起きているのか理解できたと思います。code='X'つまり、の最初の一致を強制しますがobj、兄弟軸は強制しません。

obj言い換えると、「a)下位の兄弟がなくindex、b)子孫があるノードを見つけてくださいcode='X'。これらの基準を満たすノードはありません。

もちろん、兄弟だけでなく、子孫もいる兄弟だけを考慮するつもりでしcode='X'

これを試してください(このXML Playgroundで実行可能)

root/obj[datalist/data/code='X'][
    not(preceding-sibling::obj[
        datalist/data/code='X'
    ]/index &lt; index)
    and
    not(following-sibling::obj[
        datalist/data/code='X'
    ]/index &lt; index)
]/datalist/data/value
于 2012-07-06T23:10:48.833 に答える