XSLT 2.0 XML转CSV:移除data字段引号与末尾逗号
解决XSLT 2.0生成CSV时data字段的多余逗号与格式问题
我明白你现在的困扰——作为XSLT新手,处理嵌套数组格式确实容易在分隔符和引号上踩坑。你的核心问题是生成的data字段出现了多余的逗号和不正确的格式,我们可以通过优化XSLT的节点处理逻辑来解决。
问题分析
从你提供的代码和输出结果来看,主要有两个核心问题:
- 顶点坐标(x/y/z)之间没有正确添加逗号分隔符,导致格式混乱
- 多个顶点数组之间的逗号处理不当,末尾出现多余逗号
- 手动拼接字符串时的逻辑失误,引发不必要的符号问题
修正后的XSLT代码
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="no" method="text"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <!-- CSV表头 --> seriesUID,annotationType,coordSys,data,name,label <xsl:for-each select="//gobject"> <xsl:variable name="seriesUID" select="ancestor::image/@name"/> <!-- 提取seriesUID(去掉.dcm后缀) --> <xsl:value-of select="substring-before($seriesUID, '.dcm')"/> <!-- 拼接固定值与属性 --> <xsl:value-of select="concat(',polygon,Image,')"/> <!-- 生成正确的嵌套数组格式data字段 --> <xsl:text>[</xsl:text> <xsl:value-of select="polyline/vertex/concat('[', @x, ',', @y, ',', @z, ']')" separator=","/> <xsl:text>],</xsl:text> <!-- 处理name和label(你的XML中gobject只有type属性,这里按需调整) --> <xsl:value-of select="@type"/> <xsl:text>,</xsl:text> <xsl:value-of select="@label"/> <!-- 换行 --> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
关键修改说明
- 使用
xsl:value-of的separator属性:替代手动循环拼接逗号,自动处理多个顶点数组之间的分隔,彻底避免末尾出现多余逗号。 - 正确拼接顶点坐标:每个顶点的x/y/z之间明确添加逗号,确保内部数组格式标准(如
[636.0,1920.0,0.0])。 - 调整输出模式:设置
method="text"确保CSV输出纯文本,避免不必要的XML转义或引号;去掉indent="yes"防止额外空格干扰CSV格式。 - 简化代码结构:合并多个零散的
xsl:value-of和concat操作,让代码更易读和维护。
测试输出结果
用你提供的XML数据测试,生成的CSV行将是:
101272,polygon,Image,[[636.0,1920.0,0.0],[604.0,2296.0,0.0]],Right, 101280,polygon,Image,[[1776.0,392.0,0.0],[1456.0,424.0,0.0]],Right,
可以看到data字段的格式完全符合要求:没有多余逗号和错误引号,是标准的嵌套数组结构。
另外注意:你的XML中gobject节点只有type属性,没有annotationType、coordSys和label属性,所以我根据你的需求用固定值填充了对应字段,如果实际场景中有这些属性,你可以替换回对应的@annotationType等即可。
内容的提问来源于stack exchange,提问作者Sindhu g
相关产品推荐
相关产品推荐

