2009-06-04 5 views
11

Ich versuche, eine XSLT zu schreiben, die ein XML-Dokument, das ich habe, in eine CSV-Datei umwandeln wird. Hier ist ein Beispiel der XML:Wie schreibe ich ein XSLT um XML in CSV zu transformieren?

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

Was ich will, ist ein XSLT, die ausgegeben wird, wie so:

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

Ich glaube, ich habe den C# -Code richtig, die Transformation zu initiieren, sondern nur für den Fall ich weiß nicht, hier ist der Code auch:

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); 
     } 
    } 
} 

Antwort

17

eine Vorlage erstellen, die alle Benutzer übereinstimmt, dann ziehen Sie die Informationen, die Sie im Auftrag benötigen Sie wollen:

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

Offensichtlich müssen Sie sicherstellen, dass Leerstellen so gehandhabt werden, wie Sie es möchten, mit Zeilenumbrüchen an den richtigen Stellen. Ich überlasse das dem Leser als Übung.

+0

Danke. Es ist zumindest endlich die Werte aus meiner XML-Beispieldatei abrufen (obwohl die Formatierung immer noch verrückt ist). Aus irgendeinem Grund bekomme ich Zeilenumbrüche und seltsame zusätzliche Leerzeichen mit der folgenden XSLT: , ,

-3

In meiner Erfahrung habe ich immer XSLT auf der Client-Seite der Dinge nicht Server-Seite, die mit C#

+3

Nun, das xslt wird von einer exe verwendet ... aber im Allgemeinen ist es * sicherer * xslt am Server zu benutzen ... es ist sehr schmerzhaft zu versuchen, xslt zu schreiben mit dem xslt-Prozessor jeder Browservariante umgehen. –

+0

Vielleicht keine sehr hilfreiche Antwort ... Ich habe sicherlich XSLT Server-Seite in Java verwendet, um XML-Daten zu transformieren. Schnell, effizient, Standard. Was ist, wenn Ihre Kunden kein JavaScript verwenden können? – Brabster

+0

Vielleicht bin ich verwirrt über die Bedeutung von XSLT, ist es ein Regenschirm für alle und alle XML-Transformationen? Zum Beispiel, wenn ich die SimpleXML-Bibliothek von PHP verwende, um etwas XML durchzuspähen und es auszuspucken, wie HTML, CSV oder was auch immer als XSLT betrachtet wird? Ich dachte XSLT war seine eigene Markup/Sprache –

7

ich immer ist das, was Sie lieber den Browser-Prozess die XML entlastet den Server zu versuchen scheinen verwendet lassen mach weiter mit anspruchsvolleren Jobs. Nichtsdestoweniger, hier ist eine Beispiel-XSLT, die Ihre XML übersetzen und wie oben gezeigt im CSV-Format präsentieren soll.

Hoffe, dieser Beispielcode hilft, wenn nicht, lass es mich wissen.

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

Es tut mir leid, aber das wird nicht funktionieren, weil Ihr Code drei zusätzliche Zeilenumbrüche machen würde. Erwägen Sie die Verwendung von für Kommas. – alamar

+1

Danke für Ihren Kommentar, Alamar. Ich habe die ganze Lösung auf meinem Blog gepostet, bitte schauen Sie und lassen Sie mich wissen, wenn Sie noch irgendwelche Zeilenumbrüche haben. Ich habe auch ein paar Dinge, die Sie über die Ausgabe wissen wollen, erklärt. Hier ist der Beitrag: http: //www.jroller.com/evans/entry/using_xslt_to_transform_xml –

+0

Es wäre besser gewesen, einfach ',' und '[' in ihre eigenen xsl: value-of-Elemente zu schreiben. Dadurch können Sie es formatieren, wie Sie möchten, und keine zusätzlichen Zeilenumbrüche einführen. Eigentlich ... Ich werde es auf dieses Format bearbeiten. – jsight

Verwandte Themen