如何使用XSLT从NrOfConvoys与annotationText节点中获取最大值?
解决从XML的NrOfConvoys和annotationText节点获取最大值的问题
首先得提个小问题:你的XML结构缺少根节点,这会让大多数XML解析工具直接报错,所以第一步先把XML包裹在一个根节点里(比如<Root>),修正后的结构如下:
<Root> <InstructionListPosition> <Instruction> <Navigation> <NrOfConvoys>2</NrOfConvoys> <annotationText>5</annotationText> </Navigation> </Instruction> </InstructionListPosition> <InstructionListPosition> <Instruction> <Navigation> <NrOfConvoys>20</NrOfConvoys> <annotationText>10</annotationText> </Navigation> </Instruction> </InstructionListPosition> </Root>
接下来给你两种实用的解决方案,覆盖不同的使用场景:
方法一:用Python标准库快速处理(无额外依赖)
如果你不想装第三方库,用Python自带的xml.etree.ElementTree就能搞定:
import xml.etree.ElementTree as ET # 解析XML(这里假设你把修正后的XML存在本地文件里,也可以直接传入字符串) tree = ET.parse("your_xml_file.xml") root = tree.getroot() # 收集所有目标节点的数值 all_values = [] # 遍历所有Navigation节点 for nav_node in root.findall(".//Navigation"): # 提取并转换数值 nr_convoys = int(nav_node.find("NrOfConvoys").text) annot_text = int(nav_node.find("annotationText").text) all_values.extend([nr_convoys, annot_text]) # 计算最大值 max_value = max(all_values) print(f"所有节点中的最大值是: {max_value}")
运行后会输出所有节点中的最大值是: 20,正好对应你XML里的最大数值。
方法二:用lxml+XPath(更简洁高效)
如果你经常和XML打交道,lxml的XPath支持能让代码更紧凑:
先安装lxml(如果没装的话):
pip install lxml
然后编写代码:
from lxml import etree # 解析XML tree = etree.parse("your_xml_file.xml") # 用XPath一次性选中所有目标节点,转成整数列表 all_values = [int(node.text) for node in tree.xpath("//NrOfConvoys | //annotationText")] # 直接取最大值 max_value = max(all_values) print(f"所有节点中的最大值是: {max_value}")
这段代码效果和方法一完全一致,但XPath表达式//NrOfConvoys | //annotationText能一次性定位所有目标节点,代码更简洁。
额外提醒
- 如果XML里可能存在非数值的文本,记得加异常处理,避免
int()转换报错 - 如果需要每个InstructionListPosition组内的最大值,只需要调整遍历逻辑,在每个组内单独收集数值再取最大即可
内容的提问来源于stack exchange,提问作者Tejas Thakor
相关产品推荐
相关产品推荐

