XSLT映射:将嵌套child节点移至父级root节点下
解决方案
需求说明
需要将嵌套的<child>节点提升为根节点的直接子节点,同时保留原节点内的内容。
输入XML:
<root> <test>1</test> <child> <test2>test2</test2> <child> <test3>test3</test3> <test4>test4</test4> </child> </child> </root>
期望输出XML:
<root> <test>1</test> <child> <test2>test2</test2> </child> <child> <test3>test3</test3> <test4>test4</test4> </child> </root>
方法1:使用XSLT
XSLT是XML转换的标准工具,以下样式表可实现需求:
<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> <!-- 处理根节点下的child节点 --> <xsl:template match="root/child"> <!-- 复制当前child节点,排除内部的child子节点 --> <xsl:copy> <xsl:apply-templates select="@*|node()[not(self::child)]"/> </xsl:copy> <!-- 将内部嵌套的child节点提升为根节点的直接子节点 --> <xsl:apply-templates select="child"/> </xsl:template> <!-- 阻止嵌套的child节点被默认模板重复处理 --> <xsl:template match="child/child"/> </xsl:stylesheet>
逻辑说明:
- 通用模板负责复制所有非目标节点,保证原有内容不丢失
- 匹配根节点下的
<child>,先输出不含嵌套<child>的当前节点,再将内部嵌套的<child>直接输出为根节点的子节点 - 最后一个模板避免嵌套
<child>被默认规则重复输出
方法2:使用Python内置库xml.etree.ElementTree
如果用代码实现,Python内置库可以快速完成转换:
import xml.etree.ElementTree as ET # 解析输入XML tree = ET.parse('input.xml') root = tree.getroot() # 遍历根节点下的所有child节点 for parent_child in root.findall('child'): # 查找当前child内部的嵌套child节点 nested_child = parent_child.find('child') if nested_child is not None: # 将嵌套child移动到根节点下 root.append(nested_child) # 从原父child节点中移除嵌套child parent_child.remove(nested_child) # 格式化XML输出(Python 3.9+支持indent方法) ET.indent(tree, space=' ') tree.write('output.xml', encoding='utf-8', xml_declaration=True)
逻辑说明:
- 解析输入XML文件
- 定位根节点下的所有
<child>节点 - 检查每个
<child>内部是否存在嵌套的<child> - 若存在,将嵌套节点移动到根节点层级,同时从原父节点中移除
- 格式化输出XML文件
内容的提问来源于stack exchange,提问作者Karimulla Shaik
相关产品推荐
相关产品推荐

