如何用XSLT将XML转CSV并合并指定列及添加记录总数尾行
XML转CSV:实现列合并+尾行总记录数
核心方案
在你现有实现总记录数的XSLT基础上,通过XSLT字符串拼接函数完成多列合并,同时保留统计逻辑。以下是具体示例:
模拟输入XML(匹配常见业务结构)
<root> <record> <id>1</id> <name>Alice</name> <phone>123-456-7890</phone> <email>alice@demo.com</email> </record> <record> <id>2</id> <name>Bob</name> <phone>098-765-4321</phone> <email>bob@demo.com</email> </record> </root>
修改后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <!-- 定义CSV分隔符、换行符、合并列分隔符 --> <xsl:variable name="csv-sep" select="','"/> <xsl:variable name="line-break" select="' '"/> <xsl:variable name="merge-sep" select="' | '"/> <!-- 统计总记录数 --> <xsl:variable name="total-records" select="count(/root/record)"/> <xsl:template match="/"> <!-- 输出CSV表头 --> <xsl:text>ID,Name,Contact</xsl:text> <xsl:value-of select="$line-break"/> <!-- 遍历输出每条记录 --> <xsl:for-each select="/root/record"> <xsl:value-of select="id"/> <xsl:value-of select="$csv-sep"/> <xsl:value-of select="name"/> <xsl:value-of select="$csv-sep"/> <!-- 合并phone和email为单列 --> <xsl:value-of select="concat(phone, $merge-sep, email)"/> <xsl:value-of select="$line-break"/> </xsl:for-each> <!-- 输出尾行总记录数 --> <xsl:text>Total Records: </xsl:text> <xsl:value-of select="$total-records"/> </xsl:template> </xsl:stylesheet>
预期CSV输出
ID,Name,Contact 1,Alice,123-456-7890 | alice@demo.com 2,Bob,098-765-4321 | bob@demo.com Total Records: 2
关键细节说明
- 列合并逻辑:用
concat()函数直接拼接多列文本,自定义分隔符区分原字段内容;如果使用XSLT 2.0及以上版本,推荐用string-join((phone, email), $merge-sep),更适合3列及以上合并场景。 - 特殊字符处理:如果XML字段包含逗号、双引号等CSV特殊字符,需添加转义:
<!-- 给字段套双引号,并转义内部双引号 --> <xsl:value-of select="concat('"', replace(name, '"', '""'), '"')"/> - 总记录数保留:原有的
count()统计逻辑直接复用,放在遍历完成后输出即可。
内容的提问来源于stack exchange,提问作者sandeep himgire
相关产品推荐
相关产品推荐

