XPath 1.0 самое низкое значение независимо от порядка - PullRequest
0 голосов
/ 17 мая 2018

У меня есть эти данные, и я ищу самую низкую ставку.

<root>
    <current_bid>$1.00</current_bid>
    <current_bid>$2.00</current_bid>
    <current_bid>$3.00</current_bid>
    <current_bid>$4.00</current_bid>
    <current_bid>$5.00</current_bid>
</root>

Это моя попытка XPath 1.0:

 //current_bid[not(translate (., '$,.','') > translate(//current_bid, '$,.',''))]

И он работает нормально (возвращает только ставку в 1 доллар) с данными выше, но если я изменю порядок данных, скажем так:

<root>
    <current_bid>$5.00</current_bid>
    <current_bid>$1.00</current_bid>
    <current_bid>$2.00</current_bid>
    <current_bid>$3.00</current_bid>
    <current_bid>$4.00</current_bid>
</root>

Тогда это дает неправильный вывод (возвращает все значения).

Разве порядок не должен быть неактуальным, когда я использую // current_bid, так как он запрашивает весь документ?

Кроме того: как бы я поступил, если бы хотел получить вторую самую низкую ставку?

1 Ответ

0 голосов
/ 21 мая 2018

XPath 1.0 обрабатывает узлы в порядке документов, поэтому невозможно отсортировать их с помощью чистого XPath. Это можно сделать с помощью XSL-обработки Этот подход работает, только если минимум находится на первой позиции. Xpath:
'//current_bid[(position()<=last()) and not(translate (., "$,.","") > translate(//current_bid, "$,.",""))]'

Пример:

<root>
    <current_bid>$1.00</current_bid>
    <current_bid>$5.00</current_bid>
    <current_bid>$2.00</current_bid>
    <current_bid>$4.00</current_bid>
    <current_bid>$3.00</current_bid>
</root>

Тестирование в командной строке с помощью xmllint

xmllint --xpath '//current_bid[(position()<=last()) and not(translate (., "$,.","") > translate(//current_bid, "$,.",""))]' test.xml ; echo

Результат:

<current_bid>$1.00</current_bid>

Если количество узлов известно заранее, возможно, это можно сделать с помощью вложенных условий, но даст очень сложное выражение XPath.

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