2

我必须使用 xpath 1.0 在两个不同节点上使用两个标准在 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 <value>(在<obj/data>我们的例子中,我们将有 DDD 作为结果)。<code=X><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'for 的初始匹配中强制执行obj,而不是在兄弟轴中强制执行。

换句话说,您是在说:“给我找一个obj节点,它 a) 没有具有 lower 的兄弟姐妹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 回答