使用XSLT 2.0重构XML层级:合并多Partner下的Header/Item
合并XML中多个Partner节点下的Header到单个自定义Partner节点
方案1:使用XSLT(XML样式表转换)
XSLT是处理XML结构重排的原生方案,你可以编写以下样式表,将所有Header节点归集到指定partnerId的Partner节点中:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 复制所有节点和属性,除非有特殊匹配规则 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配isaPartners节点,替换为包含单个自定义Partner的结构 --> <xsl:template match="isaPartners"> <isaPartners> <!-- 自定义partnerId,这里设置为PartnerD,可自行修改 --> <Partner partnerId="PartnerD"> <!-- 提取所有Partner下的Header节点 --> <xsl:apply-templates select="//Partner/Header"/> </Partner> </isaPartners> </xsl:template> </xsl:stylesheet>
使用方式:将上述XSLT保存为merge-partners.xsl,然后用XSLT处理器(如Saxon、libxslt)执行转换,命令示例:
xsltproc merge-partners.xsl input.xml > output.xml
方案2:使用Python ElementTree脚本
如果你熟悉Python,可以用内置的xml.etree.ElementTree库实现,代码逻辑清晰易修改:
import xml.etree.ElementTree as ET # 解析输入XML tree = ET.parse('input.xml') root = tree.getroot() # 获取所有Header节点 all_headers = root.findall('.//Partner/Header') # 找到isaPartners节点并清空原有内容 isa_partners = root.find('isaPartners') for partner in list(isa_partners): isa_partners.remove(partner) # 创建新的Partner节点,设置自定义partnerId new_partner = ET.Element('Partner', {'partnerId': 'PartnerD'}) # 添加所有Header到新Partner下 for header in all_headers: new_partner.append(header) # 将新Partner加入isaPartners isa_partners.append(new_partner) # 保存输出XML tree.write('output.xml', encoding='UTF-8', xml_declaration=True)
说明
- 两个方案都支持修改
partnerId的值,替换代码中对应的字符串即可 - XSLT方案无需编写脚本,适合纯XML生态的场景;Python方案更灵活,可扩展其他逻辑
内容的提问来源于stack exchange,提问作者Eric Smith
相关产品推荐
相关产品推荐

