如何用XML和XSLT读取含逗号字段值并生成正确CSV
解决带逗号字段的XML转CSV问题
问题分析
现有代码存在几个关键问题:
- XSLT匹配的
Export/Record节点在提供的XML中不存在,XML根节点为ExportDocumentTest,且缺少实际数据记录 - 包含逗号的字段未用双引号包裹,导致CSV解析时将逗号识别为列分隔符,输出错乱
- 表头名称不符合需求(原代码输出
AddressLine2,需要Address2)
修正后的代码
补充实际数据的XML示例
首先在XML中添加实际记录数据,示例如下:
<?xml version="1.0" encoding="utf-8" ?> <ExportDocumentTest> <definitions> <Table Name="Header" Enabled="Y"> <Columns> <Column Name="H_Address2" Value="AddressLine 2" Source="Text" ReportColumn="1" Enabled="Y"/> </Columns> </Table> <Columns> <Column Name="D_Address2" DataType="string" Source="Text" Value="emp_address1"/> </Columns> </definitions> <!-- 新增实际数据记录 --> <Records> <Record> <D_Address2>Sixth Floor, 99 Gresham Street</D_Address2> </Record> </Records> </ExportDocumentTest>
修正后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> <xsl:variable name="VAR_DELIMITER" select="','" /> <xsl:variable name="VAR_QUOTE" select="'"'" /> <!-- 定义双引号变量 --> <xsl:output method="text" encoding="utf-8"/> <!-- 处理根节点 --> <xsl:template match="/"> <!-- 输出表头 --> <xsl:text>Address2</xsl:text> <xsl:text>
</xsl:text> <!-- 换行符 --> <!-- 遍历所有记录 --> <xsl:for-each select="ExportDocumentTest/Records/Record"> <!-- 对包含逗号的字段添加双引号包裹 --> <xsl:choose> <xsl:when test="contains(D_Address2, $VAR_DELIMITER)"> <xsl:value-of select="concat($VAR_QUOTE, D_Address2, $VAR_QUOTE)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="D_Address2"/> </xsl:otherwise> </xsl:choose> <xsl:text>
</xsl:text> <!-- 换行符 --> </xsl:for-each> </xsl:template> </xsl:stylesheet>
最终CSV输出
Address2 "Sixth Floor, 99 Gresham Street"
此输出可被CSV工具正确解析,带逗号的地址会被识别为单个完整字段。
内容的提问来源于stack exchange,提问作者Rohit S
相关产品推荐
相关产品推荐

