You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用XPath获取单场比赛中得分最高的球员?

用XPath找出单场比赛中得分最高的球员

先把你提供的XML文档贴出来方便参考:

<?xml version="1.0" encoding="UTF-8"?>
<match>
<summary>
<team name="Barça" score="7">
<scorecard>
<name points="1">Iniesta</name>
<name points="2">Suarez</name>
<name points="4">Messi</name>
</scorecard>
</team>
<team name="Madrid" score="26">
<scorecard>
<name points="3">Ronaldo</name>
<name points="1">Buitre</name>
<name points="2">Bale</name>
</scorecard>
</team>
</summary>
</match>

根据你的需求,我分两种XPath版本给出解决方案——不同XML解析工具对XPath版本的支持有差异,你可以根据自己的使用场景选择:

XPath 2.0(语法更简洁,推荐支持的场景使用)

XPath 2.0内置了max()函数,可以直接计算所有球员的得分最大值,再匹配对应的球员节点:

//name[number(@points) = max(//name/@points/number(.))]

解释:

  • //name:选中所有球员节点
  • number(@points):把球员的points属性转为数值,避免字符串比较的误差
  • max(//name/@points/number(.)):计算所有球员得分的最大值
  • 整个表达式的逻辑是:找出得分等于所有球员最高分的那个球员节点

执行后会返回:

<name points="4">Messi</name>

XPath 1.0(兼容更多旧版工具)

XPath 1.0没有内置max()函数,我们可以用反向排除的逻辑实现需求:

//name[not(//name/@points > @points)]

解释:

  • not(//name/@points > @points):意思是不存在任何一个球员的得分比当前球员高,那当前球员自然就是得分最高的
  • 这里无需额外转数值类型:XPath 1.0中如果两个操作数都是数字格式的字符串,会自动转为数值进行比较

执行这个表达式同样会返回得分最高的Messi节点。

如果需要直接获取球员的名字文本,可以在表达式末尾追加/text()

//name[number(@points) = max(//name/@points/number(.))]/text()

结果就是:Messi

内容的提问来源于stack exchange,提问作者Kiensabe

火山引擎 最新活动