2013-05-16 38 views
-2

XML是:XML到CSV使用XSLT

<projects> 
    <project> 
     <name ID="A" StartDate='2012-01-01' EndDate='2012-01-30'>Shockwave</name> 
     <language>Ruby</language> 
     <Manager ID="M1">Nathan</Manager> 
    </project> 
    <project> 
     <name ID="B" StartDate='2012-01-01' EndDate='2012-02-30'>Other</name> 
     <language>Erlang</language> 
     <Manager ID="M2">Kristi</Manager> 
    </project> 
</projects> 

我想用XSLT這個XML複製到CSV。有1000個這樣的項目。 我怎樣才能得到下圖所示爲CSV輸出:

A;2012-01-01;2012-01-30;Shockwave;Ruby;M1;Nathan|B;2012-01-01;2012-02-30;Other;Erlang;M2;Kristi| 
+0

XSLT 1.0或2.0? – harpo

+0

xml 1.0 ....屬性不是靜態的,從一個XML文件更改爲另一個... –

+0

我嘗試瞭解http://stackoverflow.com/questions/365312/xml-to-csv-using-xslt上的解決方案但不復制項目ID –

回答

1

嘗試這樣的事情,而不是。它將在元素的文本之前輸出任何屬性。

XML輸入

<projects> 
    <project> 
     <name ID="A">Shockwave</name> 
     <language>Ruby</language> 
    </project> 
    <project> 
     <name ID="B">Other</name> 
     <language>Erlang</language> 
    </project> 
</projects> 

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="project"> 
     <xsl:apply-templates select="@*|node()"/> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 

    <xsl:template match="@*"> 
     <xsl:value-of select="."/> 
     <xsl:if test="../text() or parent::project"> 
      <xsl:text>,</xsl:text> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="*[ancestor::project]"> 
     <xsl:apply-templates select="@*"/> 
     <xsl:if test="preceding-sibling::*"> 
      <xsl:text>,</xsl:text> 
     </xsl:if> 
     <xsl:value-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

A,Shockwave,Ruby 
B,Other,Erlang 

EDIT對新要求

XML輸入

<projects> 
    <project> 
     <name ID="A" StartDate='2012-01-01' EndDate='2012-01-30'>Shockwave</name> 
     <language>Ruby</language> 
     <Manager ID="M1">Nathan</Manager> 
    </project> 
    <project> 
     <name ID="B" StartDate='2012-01-01' EndDate='2012-02-30'>Other</name> 
     <language>Erlang</language> 
     <Manager ID="M2">Kristi</Manager> 
    </project> 
</projects> 

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="project"> 
     <xsl:apply-templates select="@*|node()"/> 
     <xsl:text>|</xsl:text> 
    </xsl:template> 

    <xsl:template match="@*"> 
     <xsl:if test="count(parent::*/@*)=1 and not(parent::project)"> 
      <xsl:text>;</xsl:text> 
     </xsl:if> 
     <xsl:value-of select="."/> 
     <xsl:if test="parent::project or (last())"> 
      <xsl:text>;</xsl:text> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="*[ancestor::project]"> 
     <xsl:apply-templates select="@*"/> 
     <xsl:if test="preceding-sibling::* and not(@*)"> 
      <xsl:text>;</xsl:text> 
     </xsl:if> 
     <xsl:value-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

A;2012-01-01;2012-01-30;Shockwave;Ruby;M1;Nathan|B;2012-01-01;2012-02-30;Other;Erlang;M2;Kristi| 
+1

@Shiny p - 如果你想更新XML輸入,請更新你的問題,而不是在我的答案。 –

+0

- 我更新了我的問題。是否有可能得到我的問題?我嘗試了你用不同的方式提出的建議,這個XSLT在Ruby之後並沒有給出一個「,」。請告訴我如果如果有,那麼這將對我很有幫助。 –

+0

@shinyp - Thanks: - )。我做了一個應該可以工作的更新。我沒有太多時間,所以讓我知道是否有什麼不正常工作。 –

1

使用您解掛,但改線

<xsl:for-each select="child::*"> 

<xsl:for-each select="child::*|attribute::*"> 

這將選擇屬性以及節點。

+0

這給了我一個XSLT編譯器錯誤 –

+1

@shinyp,對不起,請參閱編輯。這就是我發佈未經測試的代碼! – harpo

+0

非常感謝這個工作,我得到了我所需要的.. –