You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用XSL将XML转CSV,从不同子节点提取元素生成对应行?

用XSLT实现XML到指定CSV的转换

这个需求的核心是把两个独立的节点列表(child1和child2)按位置一一配对,生成对应的CSV行,我来给你提供两种可行的实现方案,同时拆解关键逻辑:

核心思路

child1和child2是两个平行的节点集合,我们需要通过节点的位置索引将第N个child1和第N个child2绑定到同一行,提取它们的子节点值后用逗号分隔,最后输出标准CSV格式。

XSLT 1.0 实现(兼容大多数处理器)

XSLT 1.0是应用最广泛的版本,下面的代码可以在几乎所有XSLT处理器中运行:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 设置输出为纯文本,避免XML标签干扰 -->
    <xsl:output method="text" encoding="UTF-8"/>
    
    <xsl:template match="/root">
        <!-- 输出CSV表头,&#10;是换行符 -->
        <xsl:text>child1,child2&#10;</xsl:text>
        
        <!-- 遍历所有child1节点 -->
        <xsl:for-each select="child1">
            <!-- 存储当前child1的位置索引 -->
            <xsl:variable name="current-position" select="position()"/>
            
            <!-- 输出当前child1的value1值 -->
            <xsl:value-of select="value1"/>
            <xsl:text>,</xsl:text>
            
            <!-- 匹配对应位置的child2节点,不存在则输出空值 -->
            <xsl:value-of select="/root/child2[$current-position]/value2"/>
            
            <!-- 换行,生成新的CSV行 -->
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

关键逻辑解释

  • <xsl:output method="text">:强制输出纯文本格式,这是生成CSV的基础,避免输出XML结构。
  • $current-position变量:记录当前遍历的child1的位置,用来精准匹配同位置的child2,确保两个节点一一对应。
  • &#10;:代表换行符,如果你需要适配Windows系统的换行格式,可以替换为&#13;&#10;(CRLF)。
  • 容错处理:如果child1和child2的数量不一致(比如child1有3个,child2只有2个),缺失的位置会输出空值,保证CSV行的完整性。

XSLT 2.0 简化实现

如果你的环境支持XSLT 2.0(比如使用Saxon处理器),可以用更简洁的写法:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8"/>
    
    <xsl:template match="/root">
        <!-- 输出表头 -->
        <xsl:text>child1,child2&#10;</xsl:text>
        
        <!-- 遍历child1,同时匹配对应位置的child2 -->
        <xsl:for-each select="child1">
            <!-- 用separator直接指定分隔符,简化代码 -->
            <xsl:value-of select="value1, /root/child2[position() = current()/position()]/value2" separator=","/>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

XSLT 2.0的<xsl:value-of>支持同时输出多个值,并通过separator参数指定分隔符,代码更紧凑。

测试结果

将你提供的XML输入上述XSLT,会生成完全符合预期的CSV:

child1,child2
100,300
200,400

内容的提问来源于stack exchange,提问作者Aniruddha P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:01:08