我必须使用 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>
我们想要检索 <value>
<obj/data>
的与 <code=X>
<obj>
内最低 <index>
(在我们的示例中,我们将得到 DDD 作为结果)。
我尝试了以下表达式,但它似乎不起作用:
/root/obj[datalist/data/code='X'][not(preceding-sibling::obj/index <= index)
and not(following-sibling::obj/index <= index)]/datalist/data/value
但是不起作用
最佳答案
经过一段时间的观察,我想我已经弄清楚发生了什么。简而言之,您在 obj
的初始匹配中强制执行 code='X'
,但不在同级轴中执行。
换句话说,您是在说:“给我找一个 obj
节点,其中 a) 没有索引较低的兄弟节点,并且 b) 具有后代 code='X'
。没有节点满足这些条件。
当然,您的意思是只考虑也有后代code='X'
的 sibling ,而不仅仅是任何 sibling 。 p>
试试这个(可在 this XML Playground 运行)
root/obj[datalist/data/code='X'][
not(preceding-sibling::obj[
datalist/data/code='X'
]/index < index)
and
not(following-sibling::obj[
datalist/data/code='X'
]/index < index)
]/datalist/data/value
关于debugging - xpath 表达式来模拟具有多个条件的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11363408/