如何在XSLT中使用for-each对两个列表的同ID节点配对
按ID配对XML中list/desc与rec/val的解决方案
首先明确你的需求:将<list>下每个<desc>的name属性,和<rec>下同id的<val>文本内容一一对应起来。下面给你两种实用的实现方式:
方法1:使用XSLT转换(纯XML原生处理)
XSLT是XML结构转换的标准工具,下面的样式表可以直接输出结构化的配对结果:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 匹配根节点开始处理 --> <xsl:template match="/xxx"> <paired-data> <!-- 遍历所有list下的desc节点 --> <xsl:for-each select="yyy/list/desc"> <pair id="{@id}"> <name><xsl:value-of select="@name"/></name> <!-- 通过id匹配对应的rec/val节点 --> <value><xsl:value-of select="../../../yyy/rec/val[@id = current()/@id]"/></value> </pair> </xsl:for-each> </paired-data> </xsl:template> </xsl:stylesheet>
将该XSLT与你的原始XML配合处理后,会得到清晰的配对结果:
<?xml version="1.0" encoding="UTF-8"?> <paired-data> <pair id="1"> <name>Name1</name> <value>Value1</value> </pair> <pair id="2"> <name>Name2</name> <value/> </pair> <pair id="3"> <name>Name3</name> <value>IValue3</value> </pair> </paired-data>
方法2:使用Python脚本(编程式处理)
如果你更习惯用代码灵活处理,可以用Python内置的xml.etree.ElementTree模块实现:
import xml.etree.ElementTree as ET # 解析XML(可替换为你的文件路径或直接传入XML字符串) tree = ET.parse('your_xml_file.xml') root = tree.getroot() # 先把rec下的val按id存入字典,方便快速查找 val_dict = {} for val_node in root.find('.//rec').findall('val'): val_id = val_node.get('id') # 处理空值情况,避免None val_dict[val_id] = val_node.text.strip() if val_node.text else '' # 遍历desc节点完成配对 paired_list = [] for desc_node in root.find('.//list').findall('desc'): desc_id = desc_node.get('id') paired_list.append({ 'id': desc_id, 'name': desc_node.get('name'), 'value': val_dict.get(desc_id, '') }) # 打印或使用配对结果 for item in paired_list: print(f"ID: {item['id']} | Name: {item['name']} | Value: '{item['value']}'")
运行后输出结果:
ID: 1 | Name: Name1 | Value: 'Value1' ID: 2 | Name: Name2 | Value: '' ID: 3 | Name: Name3 | Value: 'IValue3'
两种方法都能精准完成按ID配对的需求,你可以根据场景选择适合的方式~
内容的提问来源于stack exchange,提问作者user3711142
相关产品推荐
相关产品推荐

