使用 XSL 转换将 XML 转换为 CSV

标签 xml xslt csv

我有一个 XML 数据,我需要使用 xsl 转换将其转换为 CSV。但问题是,XML根节点(指A、B、C节点)各不相同。请看下面:

XML data
--------
<Sheets>
<A>
<Data>
<Row>
<value1>2</value1>
<value2>4</value2>
</Row>
<Row>
<value1>5</value1>
<value2>6</value2>
</Row>   
</Data>
</A>
<B>
<Data>
<Row>
<value1>12</value1>
<value2>13</value2>
</Row>
<Row>
<value1>14</value1>
<value2>15</value2>
</Row>
</Data>
</B>
<C>
<Data>
<Row>
<value1>1</value1>
<value2>1</value2>
</Row>
<Row>
<value1>2</value1>
<value2>2</value2>
</Row>
</Data>
</C>
</Sheets>    
    CSV output should like this:
    ----------------------------
    A, 2, 4
    A, 5, 6
    B, 12, 13
    B, 14, 15
    C, 1, 1
    C, 2, 2

请帮助我。

提前致谢。

最佳答案

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output omit-xml-declaration="yes" indent="no" method="text" />

    <xsl:template match="/Sheets">
        <xsl:for-each select="*">
            <xsl:variable name="dataSet" select="name()" />
            <xsl:for-each select="Data/Row">
                <xsl:value-of select="$dataSet" />
                <xsl:text>, </xsl:text>
                <xsl:for-each select="*">
                    <xsl:value-of select="text()" />
                    <xsl:if test="position() != last()">
                        <xsl:text>, </xsl:text>
                    </xsl:if>
                </xsl:for-each>
                <xsl:text>
</xsl:text>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

关于使用 XSL 转换将 XML 转换为 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8175262/

相关文章:

java - 在jaxb中生成list标签和object标签

c# - 为最简单的 xml 文件编写最简单的 XML 反序列化类。如何避免嵌套?在根目录反序列化?

c# - XPath - 返回子节点但不返回后代

XSLT 中的变量如何在同一 XSLT 的不同位置声明、赋值和使用该变量

python - 从 CSV 导入时的 Numpy 数组

java - 将 hibernate 对象直接转换为 XML 时的任何特殊注意事项

xml - XSD 验证非命名空间元素上的命名空间属性?

xslt - 如何在 xml 文件中查找开始(最小)和结束(最大)日期?

arrays - F# 扫描缓冲区,找到以\c\f 开头且后面不跟逗号的最后一部分

python - 如何使用 csv 将列表编写为单独的元素?