使用XSLT 1.0生成Excel兼容CSV保留XML节点内逗号的问题咨询
解决方案
CSV 格式要被 Microsoft 365 Excel 正确识别,包含分隔符(逗号)、换行符、双引号的字段必须满足两个规则:
- 字段整体用英文双引号包裹
- 字段内部的英文双引号要转义为两个连续的英文双引号
你之前的代码报错无输出是因为 XPath 拼接语法错误,同时没有正确处理 CSV 转义规则,以下是可直接运行的 XSLT 1.0 代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" omit-xml-declaration="yes"/> <!-- 转义模板:把内容中的双引号替换为两个双引号,符合CSV规范 --> <xsl:template name="escape-quotes"> <xsl:param name="content"/> <xsl:choose> <xsl:when test="contains($content, '"')"> <xsl:value-of select="substring-before($content, '"')"/> <xsl:text>""</xsl:text> <xsl:call-template name="escape-quotes"> <xsl:with-param name="content" select="substring-after($content, '"')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$content"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- 匹配根节点输出CSV行 --> <xsl:template match="dmodule"> <!-- 第一个字段:title --> <xsl:value-of select="normalize-space(title)"/> <xsl:text>,</xsl:text> <!-- 第二个字段:含逗号的simplePara,转义后加双引号包裹 --> <xsl:text>"</xsl:text> <xsl:call-template name="escape-quotes"> <xsl:with-param name="content" select="normalize-space(applic/displayText/simplePara)"/> </xsl:call-template> <xsl:text>"</xsl:text> <xsl:text>,</xsl:text> <!-- 第三个字段:tminfo --> <xsl:text>"</xsl:text> <xsl:call-template name="escape-quotes"> <xsl:with-param name="content" select="normalize-space(tminfo)"/> </xsl:call-template> <xsl:text>"</xsl:text> <!-- 换行符 --> <xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet>
效果验证
运行上述代码后生成的CSV内容如下:
ABC DEF,"Block 1, Block 1+, Block 5, Block 5 Exportable","Text that should appear in the next column"
用Excel直接打开该文件,包含逗号的内容会完整保留在同一个单元格内,不会被拆分。
注意事项
- 不要混用制表符和逗号作为分隔符,统一使用逗号分隔+双引号包裹特殊字段的方案,兼容性最好
normalize-space函数可以自动去除字段前后的换行、多余空格,你如果需要保留原始空格可以去掉该函数
内容的提问来源于stack exchange,提问作者mightymax
相关产品推荐
相关产品推荐

