2013-04-22 25 views
0

我試圖使用XSLT將XML轉換爲CSV。我在這個網站上看到了許多類似的帖子,但是想提到具體的要求以及我在代碼中看到的問題。使用XSLT將XML轉換爲CSV時無法嵌入分隔符

這是我格式良好的XML文件內容。請注意,我將這個XML作爲字符串從數據庫中獲取,因此它沒有格式化。

XML文件

<myxml ver="1.0"><name>smile</name><email>[email protected]</email><phone_number/><job_title>Engineer</job_title><company_name>Stack Overflow</company_name><submission-datestamp>3/14/11 8:29 PM</submission-datestamp></myxml> 

這裏是XSLT文件

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="myxml"> 
    <xsl:for-each select="*" >  
    <xsl:if test="position() != last()"> 
     <xsl:value-of select="normalize-space(.)"/>, 
    </xsl:if> 
</xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

我正在CSV格式的內容如下:

smile, 
    [email protected], 
    , 
    Engineer, 
    Stack Overflow, 
    3/14/11 8:29 PM 

要求是:

  • 我需要顯示的標題第一
  • 逗號分隔的列表中

    smiletest @ gmail.com,EngineerStack溢出,3元/11分之14下午8:29

可以請你幫我修復我的代碼?問題出在XSLT文件中。

+0

那麼你的源代碼中沒有元素,可以使用'catalog'或'cd'這個名字,所以你的XSLT什麼都不匹配。 – Borodin 2013-04-23 00:33:38

回答

2

由於模板內有混合內容,因此您將獲得額外的回車。樣式表假定逗號後面的空格是重要的。你可以通過將你的文字放在<xsl:text>之內來防止這種情況發生。這告訴樣式表哪個文本是顯式輸出的一部分,所以如果沒有別的東西留下,但是空白,它被認爲是不重要的。

我返工樣式表略微更加使用xsl:apply-templates代替xsl:for-each「推式」樣式表中,以及在每一行的結束時加入回車:

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

<xsl:template match="/"> 
    <xsl:apply-templates mode="header"/> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="myxml/*" mode="header"> 
    <xsl:value-of select="local-name()"/> 
    <xsl:choose> 
     <xsl:when test="position() = last()"> 
      <xsl:text>&#xA;</xsl:text> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:text>,</xsl:text> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="myxml/*"> 
    <xsl:value-of select="normalize-space(.)"/> 
    <xsl:choose> 
     <xsl:when test="position() = last()"> 
      <xsl:text>&#xA;</xsl:text> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:text>,</xsl:text> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

產生以下輸出:

name,email,phone_number,job_title,company_name,submission-datestamp 
smile,[email protected],,Engineer,Stack Overflow,3/14/11 8:29 PM