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

标签 debugging xpath subquery predicate 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>

我们想要检索 <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 &lt; index)
    and
    not(following-sibling::obj[
        datalist/data/code='X'
    ]/index &lt; index)
]/datalist/data/value

关于debugging - xpath 表达式来模拟具有多个条件的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11363408/

相关文章:

debugging - 使用 Twitter 作为远程控制应用程序的机制?

javascript - 如何过滤 Firefox 错误控制台中的消息?

sql - 'value'关键字在Oracle Select语句中的作用

html - 使用 xpaths 进行 HTML 抓取有什么特别需要考虑的吗?

xml - 使用 ImportXML 提取包含字符串的链接的 URL 和 anchor

sql - 是否可以在SQL查询的 `WHERE`子句中​​比较* tuples?

sqlite - 与两个单独的选择查询相比,子查询的性能如何?

java - Eclipse 没有在我的 GWT 应用程序中的断点处停止

visual-studio - 如何调试非托管 BCL (InternalCall) 方法?

c++ - 使用常量内存使用的 xml 解析