2009-06-04 70 views
11

我正試圖編寫一個XSLT,它將轉換我必須轉換爲CSV文件的XML文檔。下面是XML的一個樣本:如何編寫XSLT以將XML轉換爲CSV?

<?xml version="1.0" encoding="utf-8"?> 
<Import> 
    <Users> 
     <User ID="user_1" EmailAddress="[email protected]"> 
      <Contact FirstName="John" LastName="Doe" /> 
      <Address Street1="808 Elm St" City="Anywhere" State="NY" /> 
     </User> 

     <User ID="user_2" EmailAddress="[email protected]"> 
      <Contact FirstName="Jane" LastName="Noone" /> 
      <Address Street1="123 Some Rd" City="Anywhere" State="NY" /> 
     </User>  
    </Users> 
</Import> 

我要的是將輸出像這樣的XSLT:

John,Doe,808 Elm St,Anywhere,NY 
Jane,Noone,123 Some Rd,Anywhere,NY 

我覺得我有C#代碼正確啓動轉換,但以防萬一我不知道,這裏的代碼,以及:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Xsl; 
using System.Configuration; 

namespace UserTransform 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string oldXML = ConfigurationSettings.AppSettings["XMLToBeTransformed"]; 
      string xsltLocation = ConfigurationSettings.AppSettings["XSLTfile"]; 
      string newCSV = ConfigurationSettings.AppSettings["NewCSVLocation"]; 

      XslCompiledTransform transform = new XslCompiledTransform(); 
      transform.Load(xsltLocation); 
      transform.Transform(oldXML, newCSV); 
     } 
    } 
} 

回答

17

創建所有用戶相匹配的模板,然後拉出您在訂單所需要的信息,你想:

<xsl:template match="//User"> 
    <xsl:value-of select="Contact/@FirstName"/>, 
    <xsl:value-of select="Contact/@LastName"/>, 
    <!--etc--> 
</xsl:template> 

很明顯,您需要確保空白符以您希望的方式進行處理,並在適當位置添加換行符。我將這個作爲練習留給讀者。

+0

謝謝。至少最終從我的示例XML文件中檢索出我想要的值(儘管格式仍然很瘋狂)。出於某種原因,我在使用以下XSLT時出現換行符和奇怪的額外空格: , 的 2009-06-04 19:03:50

-3

根據我的經驗我一直使用XSLT的事情而不是服務器端客戶端這是你似乎做什麼用C#

+3

那麼,xslt是從一個exe文件中使用的...但通常它是*更安全的*在服務器上使用xslt ...這是非常痛苦的嘗試寫xslt處理每個瀏覽器變種的xslt處理器。 – 2009-06-04 18:52:11

+0

也許不是一個非常有用的答案......我當然在Java中使用XSLT服務器端來轉換XML數據。快速,高效,標準。如果你的客戶不能使用JavaScript呢? – Brabster 2009-06-04 18:54:17

7

可以嘗試我總是喜歡讓瀏覽器處理XML緩解服務器繼續進行更苛刻的工作。也就是說,下面是一個示例XSLT,它應該翻譯您的XML並以CSV格式顯示,如上所示。

希望這個示例代碼有幫助,如果沒有,請讓我知道。

<xsl:stylesheet version="1.0"> 
    <xsl:template match="/"> 
     <table> 
      <xsl:for-each select="//User"> 
       <tr> 
        <td> 
         <xsl:value-of select="conat('[', @ID, ']')"/> 
         <xsl:value-of select="','"/> 
         <xsl:value-of select="Contact/@FirstName"/> 
         <xsl:value-of select="','"/> 
         <xsl:value-of select="Contact/@LastName"/> 
         <xsl:value-of select="','"/> 
         <xsl:value-of select="Address/@Street1"/> 
         <xsl:value-of select="','"/> 
         <xsl:value-of select="Address/@City"/> 
         <xsl:value-of select="','"/> 
         <xsl:value-of select="Address/@State"/> 
        </td> 
       </tr> 
      </xsl:for-each> 
     </table> 
    </xsl:template> 
</xsl:stylesheet>