我有这些数据,我正在寻找最低出价。
<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时,订单不应该无关紧要,因为它会查询整个文档吗?
另外:如果我想获得第二低的出价,我该怎么办?
答案 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表达式。