2011-11-17 172 views
2

我有一個XML數據,我需要使用xsl轉換將其轉換爲CSV。但問題是,XML根節點(參考A,B,C節點)各不相同。請看下面:使用XSL轉換將XML轉換爲CSV

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 

請幫幫我。

在此先感謝。

+0

你能舉個例子嗎?喜歡,你想要有文件A.csv,B.csv和C.csv與這裏給出的數據? –

+0

這會使A.csv例如: 2,4 \ n5,6(對不起,這裏沒有換行符) –

+0

不需要。我需要一個帶有像我在問題中提到的值的單個.csv文件。我更新了我的問題以顯示CSV輸出。請參閱相同的內容。 – user972255

回答

3
<?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> 
+0

謝謝湯姆。這工作完美。但我注意到的一件事是我的一些文本數據(例如0123顯示爲123)顯示爲整數值(我的意思是0在我的文本值中被截斷)。如何避免這種情況?更新了 – user972255

+0

以避免剝離前導零 –

+0

仍然是同樣的問題。另外,爲了您的信息,我將輸出寫入Excel文件。這是因爲這個問題嗎? – user972255

1

這應該輸出的文本你想要的:

<?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> 
+0

這工作,但我得到垂直方式的輸出。但它沒有任何問題。感謝您的答覆。 – user972255