如何用XPath筛选element4为Test且element3最大的element2并返回element5
XPath实现方案
适用XPath 2.0及以上版本(主流现代XPath处理器支持)
你可以直接对筛选后的节点按element3数值排序后取最大值节点,再提取element5内容,完整语句如下:
doc("xxx.xml")//element1/element2[element4="Test"] /sort(., function($node) { xs:integer($node/element3) })[last()] /element5/text()
也可以通过先取最大值再匹配节点的方式实现:
let $filtered := doc("xxx.xml")//element1/element2[element4="Test"] let $max_val := max($filtered/element3/xs:integer(.)) return $filtered[element3/xs:integer(.) = $max_val]/element5/text()
注意:使用
xs:integer()做类型转换是为了避免字符串排序误差,如果你element3存储的是浮点数,替换为xs:double()即可。如果你的处理器没有默认加载XML Schema命名空间,需要先声明xmlns:xs="http://www.w3.org/2001/XMLSchema",大部分常用处理器比如Saxon默认已经加载,无需额外配置。
适用XPath 1.0版本(老版本处理器兼容方案)
XPath 1.0没有内置max和排序函数,可以通过逻辑判断实现最大值筛选:
doc("xxx.xml")//element1/element2[element4="Test"] [not(../element2[element4="Test"]/element3/xs:integer(.) > ./element3/xs:integer(.))] /element5/text()
以上两种写法在你提供的示例XML中运行,都会返回预期结果descriptionzzzz。
内容的提问来源于stack exchange,提问作者Yorwe
相关产品推荐
相关产品推荐

