XPath不直接支持MAX/MIN聚合,但可用not()配合比较表达式实现:最大值用//price[not(. ../price)];XPath 2.0+支持max()/min()函数,更直观。

XPath 本身不直接支持“查找最大/最小值节点”这种聚合操作(比如 SQL 中的 MAX()),但可以通过比较运算和位置判断来实现——关键在于用 not() 和比较表达式构造“没有其他节点比它更大/更小”的逻辑。
查找数值最大的节点
假设 XML 中有多个 节点,你想选中值最大的那个:
//price[not(.
说明:这个表达式选出所有 price 节点中,**不存在另一个 price 节点的值比它大** 的节点。由于数值会被自动转换比较,它等价于“最大值节点”。如果多个节点值相同且都是最大,会返回全部。
常见写法还有:
-
//price[. = max(../price)] —— XPath 2.0+ 支持
max()函数,更直观;但 XPath 1.0 不支持 - (//price)[position() = 1 and not(..//price > .)] —— 加上位置限制,确保只取第一个匹配项(适合去重)
查找数值最小的节点
同理,找最小值节点用:
//price[not(. > ../price)]
意思是:该 price 的值,**不比任何同级 price 大** → 即它是最小的。
对应 XPath 2.0+ 写法:
- //price[. = min(../price)]
注意数据类型和上下文
XPath 默认按字符串比较,所以 "10" 为真(因为字符串比较看首字符)。要按数值比较,需确保节点内容可转为数字:
- 用
number()强制转换://price[number(.) > number(../price)](配合not()使用) - 或确保原始 XML 中数值不含空格、单位等干扰字符(如
比29.99 更安全)$29.99 - 若节点可能为空或非数字,
number()会返回NaN,导致比较失败;可先用string-length(normalize-space()) > 0过滤
实际例子
XML 片段:
15 8 22
查最大价格节点://price[not(. → 返回
查最小价格节点:










