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

使用XSL将XML转换为扁平化CSV格式的问题求助

问题分析与修正后的XSLT方案

你遇到的核心问题是混淆了元素和属性的选择方式,再加上路径拼写错误,导致无法获取ten、p、exp这些元素的内容。下面是具体问题点和修复后的代码:

现有XSLT的错误点

  • 元素/属性选择错误:ten、p、exp是XML中的元素(不是属性),你用了@ten、@p这种属性选择器,自然拿不到值,应该用text()来获取元素的文本内容;
  • 路径拼写错误:scenarioI是笔误,应该是scenario;
  • 循环节点选择不合理:以//exp作为循环单元逻辑不对,应该以每个scenario为单位生成一行CSV数据;
  • 多余逗号:最后一个字段后不要添加逗号,否则会导致CSV格式错误;
  • 空格未清理:元素文本可能包含首尾空格或多余空格,建议用normalize-space()处理,保证CSV数据整洁。

修正后的XSLT代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
    
    <xsl:template match="/">
        <!-- 输出CSV表头 -->
        <xsl:text>div,type,liab,unit,ten,p,asset,unit2,ten2,exp,rating&#xA;</xsl:text>
        
        <!-- 以每个scenario为循环单元,生成一行数据 -->
        <xsl:for-each select="//scenario">
            <!-- 获取group的div属性 -->
            <xsl:value-of select="../@div"/><xsl:text>,</xsl:text>
            <!-- 获取scenario的type属性 -->
            <xsl:value-of select="@type"/><xsl:text>,</xsl:text>
            <!-- 获取pqr的liab属性 -->
            <xsl:value-of select="pqr/@liab"/><xsl:text>,</xsl:text>
            <!-- 获取pqr下ten的unit属性 -->
            <xsl:value-of select="pqr/ten/@unit"/><xsl:text>,</xsl:text>
            <!-- 获取pqr下ten的文本内容(清理空格) -->
            <xsl:value-of select="normalize-space(pqr/ten/text())"/><xsl:text>,</xsl:text>
            <!-- 获取pqr下p的文本内容 -->
            <xsl:value-of select="normalize-space(pqr/p/text())"/><xsl:text>,</xsl:text>
            <!-- 获取abc的asset属性 -->
            <xsl:value-of select="abc/@asset"/><xsl:text>,</xsl:text>
            <!-- 获取abc下ten的unit属性 -->
            <xsl:value-of select="abc/ten/@unit"/><xsl:text>,</xsl:text>
            <!-- 获取abc下ten的文本内容 -->
            <xsl:value-of select="normalize-space(abc/ten/text())"/><xsl:text>,</xsl:text>
            <!-- 获取abc下exp的文本内容 -->
            <xsl:value-of select="normalize-space(abc/exp/text())"/><xsl:text>,</xsl:text>
            <!-- 获取group下Feature的rating属性 -->
            <xsl:value-of select="../Feature/@rating"/>
            <!-- 换行 -->
            <xsl:text>&#xA;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

输出结果

用修正后的XSLT处理你的XML样本,会得到符合要求的CSV:

div,type,liab,unit,ten,p,asset,unit2,ten2,exp,rating
Global,XYZ,123,DAY,10 12,0,100,DAY,11 12,0,NA

(注:你的目标CSV中exp值是10,但XML里实际是0,这里按XML原始内容输出,如需调整可修改对应字段的值)

内容的提问来源于stack exchange,提问作者Amit Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:44:34