最大谓词的XPath表达式解决方法

时间:2012-02-01 23:10:08

标签: xml xpath

鉴于此XML:

<foos>
    <foo>
        <name>Apple</name>
        <rank>1</rank>
        <key>asdfasdfasdf</key>
    </foo>
    <foo>
        <name>Orange</name>
        <rank>3</rank>
        <key>qwerqwtwetqw</key>
    </foo>
    <foo>
        <name>Apple</name>
        <rank>2</rank>
        <key>zxcvzxvcxzb</key>
    </foo>
    ...
</foos>

我试图找到具有特定名称的foo的关键,让我们说“Apple”,其中排名最高。我正在使用以下xpath表达式(缺少max函数的解决方法):

/foos/foo[name='Apple' and rank >= /foos/foo[name='Apple']/rank]/key/text()

然而,我有时会得到多个结果,即使每个名称 - 等级组合都是唯一的。我在哪里错了?

这在Java中使用 - 如果结果相关,我可以发布整个代码。

2 个答案:

答案 0 :(得分:2)

试试这个:

/foos/foo[name='Apple'][not(preceding-sibling::foo[name='Apple']/rank>./rank) and not(following-sibling::foo[name='Apple']/rank>./rank)]/key/text()

答案 1 :(得分:1)

刚想通了:

/foos/foo[name='Apple' and not(rank < /foos/foo[name='Apple']/rank)]/key/text()

这是必要的,因为测试的右侧对于/foos/foo[name='Apple']/rank返回的任何值都是正确的,所以旧版本选择了等级大于或等于的任何“Apple”foo任何其他“Apple”foo。