如何使用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表头, 是换行符 --> <xsl:text>child1,child2 </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> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
关键逻辑解释
<xsl:output method="text">:强制输出纯文本格式,这是生成CSV的基础,避免输出XML结构。$current-position变量:记录当前遍历的child1的位置,用来精准匹配同位置的child2,确保两个节点一一对应。 :代表换行符,如果你需要适配Windows系统的换行格式,可以替换为 (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 </xsl:text> <!-- 遍历child1,同时匹配对应位置的child2 --> <xsl:for-each select="child1"> <!-- 用separator直接指定分隔符,简化代码 --> <xsl:value-of select="value1, /root/child2[position() = current()/position()]/value2" separator=","/> <xsl:text> </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
相关产品推荐
相关产品推荐

