Как я могу использовать XPath для нахождения минимального значения атрибута в ряде элементов?

Одна большая вещь о модульных тестах состоит в том, что они служат документацией для того, как Ваш код предназначен для поведения. Хорошие тесты отчасти похожи на ссылочную реализацию, и товарищи по команде могут посмотреть на них, чтобы видеть, как интегрировать их код с Вашим.

30
задан GameFreak 19 September 2009 в 22:46
поделиться

4 ответа

Оказалось, что инструмент не поддерживает XPath 2.0.

XPath 1.0 не имеет причудливых min () и max () функции, поэтому, чтобы найти эти значения, нам нужно немного повозиться с логикой XPath и сравнить значения на братьях и сестрах узла:

Максимум:

/foo/bar[not(preceding-sibling::bar/@score >= @score) 
    and not(following-sibling::bar/@score > @score)]/@score

Минимум:

/foo/bar[not(preceding-sibling::bar/@score <= @score) 
    and not(following-sibling::bar/@score < @score)]/@score

При встраивании этих запросов в файлы XML как XSLT или скрипты муравьев, не забудьте кодировать < и > как & lt; с учетом & gt; .

19
ответ дан 27 November 2019 в 23:23
поделиться

Вот несколько более короткое решение.

Максимум:

/foo/bar/@score[not(. < ../../bar/@score)][1]

Минимум:

/foo/bar/@score[not(. > ../../bar/@score)][1]

Я отредактировал предикат так, чтобы он был применим к любой последовательности бара , даже если вы решите изменить путь. Обратите внимание, что родительский элемент атрибута - это элемент, которому он принадлежит.

При встраивании этих запросов в файлы XML, такие как XSLT или сценарии ant, не забудьте кодировать < и > как ] & lt; с учетом & gt; .

40
ответ дан 27 November 2019 в 23:23
поделиться

Попробуйте следующее:

//foo/bar[not(preceding-sibling::bar/@score <= @score) and not(following-sibling::bar/@score <= @score)]

Возможно, это сработает в XPath 1.0.

3
ответ дан 27 November 2019 в 23:23
поделиться

Это должно работать ...

6
ответ дан 27 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: