xpath 表达式以模拟具有多个条件的子查询

Ica*_*aro 2 debugging xpath predicate subquery xpath-1.0

我必须使用 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>
Run Code Online (Sandbox Code Playgroud)

我们想<value><obj/data>with<code=X>内检索<obj>with 的最小值<index>(在我们的示例中,我们将得到 DDD 作为结果)。

我尝试了以下表达式,但它接缝不起作用:

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

但它不起作用

Utk*_*nos 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
Run Code Online (Sandbox Code Playgroud)

  • 你已经到了重点!您的 xpath 非常接近解决方案。我只是用这种方式稍微修改了你的表达式:“/root/obj[datalist/data/code='X'][ not(preceding-sibling::obj[ datalist/data/code='X' ]/index &lt; index) 而不是(following-sibling::obj[ datalist/data/code='X' ]/index &lt; index) ]/datalist/data[code='X']/value" ,现在它似乎适用于我。太感谢了 (2认同)