如何使用XSLT 2.0拆分XML并保留父节点生成多文件?
XSLT 2.0 拆分XML并保留父节点结构的解决方案
核心思路
遍历每个ItemGroup节点,为每个节点生成独立XML文件。生成时完整复制Root、Info、Group、Client等上层父节点结构,仅将Client下的ItemGroup列表替换为当前遍历的单个ItemGroup。
完整XSLT代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 匹配根节点,启动处理流程 --> <xsl:template match="/Root"> <!-- 遍历所有ItemGroup节点 --> <xsl:for-each select="Group/Client/ItemGroup"> <!-- 生成独立输出文件,文件名可根据节点属性/内容自定义 --> <xsl:result-document method="xml" indent="yes" href="item_{ItemID}.xml"> <!-- 重构完整父节点结构 --> <Root> <!-- 复制Info节点及所有子内容 --> <xsl:copy-of select="../Info"/> <Group> <Client> <!-- 复制Client下除ItemGroup外的所有子节点 --> <xsl:copy-of select="../Client/*[not(local-name()='ItemGroup')]"/> <!-- 复制当前遍历的单个ItemGroup节点 --> <xsl:copy-of select="."/> </Client> </Group> </Root> </xsl:result-document> </xsl:for-each> </xsl:template> <!-- 屏蔽默认匹配规则,避免冗余输出 --> <xsl:template match="text()|@*"/> </xsl:stylesheet>
关键代码说明
<xsl:result-document>:XSLT 2.0原生多文件输出能力,href属性支持动态命名(示例中用ItemID作为文件名标识)。<xsl:copy-of>:完整复制目标节点及其所有子节点、属性,确保父结构的完整性和原始数据不变。- 节点过滤逻辑:
../Client/*[not(local-name()='ItemGroup')]精准保留Client下非ItemGroup的子节点,避免原多ItemGroup列表残留。
输出示例
每个生成的XML文件将保留完整父层级,仅包含单个ItemGroup,示例如下:
<Root> <Info> <Name>TestProject</Name> </Info> <Group> <Client> <ClientID>CLT001</ClientID> <ItemGroup> <ItemID>ITEM001</ItemID> <ItemName>SampleItemA</ItemName> </ItemGroup> </Client> </Group> </Root>
内容的提问来源于stack exchange,提问作者Ice2burn
相关产品推荐
相关产品推荐

