无论订购如何,XPath 1.0最低值

时间:2018-05-17 15:24:42

标签: xpath minimum

我有这些数据,我正在寻找最低出价。

<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.00美元的出价),但是如果我改变数据的顺序,让我们在这说:

<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 :(得分:0)

XPath 1.0按文档顺序处理节点,因此无法使用纯XPath对它们进行排序。可以使用XSL processing完成 这种方法只有在最小位于第一位置时才有效。 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表达式。