You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT 2.0 XML转CSV:移除data字段引号与末尾逗号

解决XSLT 2.0生成CSV时data字段的多余逗号与格式问题

我明白你现在的困扰——作为XSLT新手,处理嵌套数组格式确实容易在分隔符和引号上踩坑。你的核心问题是生成的data字段出现了多余的逗号和不正确的格式,我们可以通过优化XSLT的节点处理逻辑来解决。

问题分析

从你提供的代码和输出结果来看,主要有两个核心问题:

  1. 顶点坐标(x/y/z)之间没有正确添加逗号分隔符,导致格式混乱
  2. 多个顶点数组之间的逗号处理不当,末尾出现多余逗号
  3. 手动拼接字符串时的逻辑失误,引发不必要的符号问题

修正后的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>&#xA;</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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:15:36