【问题标题】:xpath expression to simulate subquery with multiple creiteriaxpath 表达式来模拟具有多个条件的子查询
【发布时间】:2012-07-06 13:43:55
【问题描述】:

我必须使用 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>

我们希望在&lt;obj&gt; 中检索&lt;obj/data&gt;&lt;value&gt;&lt;code=X&gt;,最小为&lt;index&gt;(在我们的例子中,我们将得到DDD)。

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

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

但它不起作用

【问题讨论】:

  • 请改写您的问题或检查语法,好像有些东西不见了...
  • 当它的obj/index 是4 并且同时有一个obj/index =2 时,“DDD”如何成为想要的结果?这种矛盾使这个问题毫无意义。请编辑并更正。
  • 你说得对,我已经修复了示例,表明我正在找到最小的 obj/index 但 obj/datalist/data/code = X

标签: debugging xpath subquery predicate xpath-1.0


【解决方案1】:

盯着这个看了很长一段时间后,我想我已经弄清楚是怎么回事了。简而言之,您在obj 的初始匹配中强制执行code='X',而不是在同级轴中。

换句话说,您是在说:“给我找一个obj 节点,它a) 没有具有较低index 的兄弟姐妹,并且b) 有后代code='X'。没有节点符合这些条件。

当然,您的意思是只考虑有后代code='X'的兄弟姐妹,而不仅仅是任何兄弟姐妹

试试这个(可在this 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

【讨论】:

  • 你已经达到目的了!您的 xpath 非常接近解决方案。我只是用这种方式稍微修改了你的表达式: "/root/obj[datalist/data/code='X'][ not(preceding-sibling::obj[ datalist/data/code='X' ]/index < index) 而不是(following-sibling::obj[ datalist/data/code='X' ]/index < index) ]/datalist/data[code='X']/value" 现在它似乎适用于我。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 2012-05-02
  • 2021-01-29
相关资源
最近更新 更多