使用XSL转换将XML转换为CSV

使用XSL转换将XML转换为CSV,xml,xslt,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> <

我有一个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>    
XML数据
--------
2.
4.
5.
6.
12
13
14
15
1.
1.
2.
2.
CSV输出应如下所示: ---------------------------- A、 2,4 A、 5,6 B、 12,13 B、 14,15 C、 1,1 C、 2,2 请帮帮我


提前感谢。

这将输出您想要的文本:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/Sheets">
<!-- This will match the letters -->
<xsl:for-each select="*">
<xsl:for-each select="*/descendant::Row">
<xsl:text>
</xsl:text>
<!-- Name of grand parent (two levels up) which is the letter -->
<xsl:value-of select="local-name(../..)"/><xsl:for-each select="*">, <xsl:value-of select="."/>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

, 

, 
, 

你能举个例子吗?例如,是否希望文件A.csv、B.csv和C.csv包含此处给定的数据?这将使A.csv成为例如:2,4\n5,6(抱歉,此处没有换行符)不。我需要一个带有我在问题中提到的值的.csv文件。我现在更新了我的问题以显示CSV输出。请参考相同的。这是可行的,但我得到了垂直方式的输出。但它没有任何问题。谢谢你的回复。谢谢汤姆。这很好用。但我注意到,我的一些文本数据(例如0123显示为123)显示为整数值(我的意思是0在我的文本值中被截断)。如何避免呢?还是一样的问题。另外,为了供您参考,我正在将输出写入Excel文件。这个问题是因为这个吗?当我在记事本中打开文件时,它看起来很好。非常感谢。知道我为什么在所有csv输出行中都有选项卡空间吗?我试过,规范化空间(.)等等。。。但什么都不管用。我的xml数据中可能存在任何问题?请帮帮我,我不明白。请详细说明。
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/Sheets">
<!-- This will match the letters -->
<xsl:for-each select="*">
<xsl:for-each select="*/descendant::Row">
<xsl:text>
</xsl:text>
<!-- Name of grand parent (two levels up) which is the letter -->
<xsl:value-of select="local-name(../..)"/><xsl:for-each select="*">, <xsl:value-of select="."/>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<?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>