Обходное выражение XPath для предиката max - PullRequest
5 голосов
/ 02 февраля 2012

Учитывая этот 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 ]

2 голосов
/ 02 февраля 2012

Попробуйте это:

/foos/foo[name='Apple'][not(preceding-sibling::foo[name='Apple']/rank>./rank) and not(following-sibling::foo[name='Apple']/rank>./rank)]/key/text()
1 голос
/ 02 февраля 2012

Просто разобрался:

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

Это необходимо, потому что правая часть теста верна для любых значений, возвращаемых /foos/foo[name='Apple']/rank, поэтому старая версия выбирает любой "Apple" foo с рангом, большим или равным любому другому "Яблоко" фу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...