2009-06-04 20 views
11

Próbuję napisać XSLT, który przekształci dokument XML, który mam do pliku CSV. Oto próbka xml:Jak napisać XSLT, aby przekształcić XML na 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> 

Co chcę to XSLT, który będzie wyjście tak:

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

Chyba mam kodu C poprawnego # zainicjowania transformacji, ale na wszelki wypadek I nie, oto ten kod, a także:

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

Odpowiedz

17

Tworzenie szablonu, który pasuje do wszystkich użytkowników, a następnie wyciągnąć informacje potrzebne w celu chcesz:

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

Oczywiście należy upewnić się, że białe znaki są obsługiwane w pożądany sposób, z znakami nowej linii we właściwych miejscach. Zostawię to jako ćwiczenie dla czytelnika.

+0

Dzięki. Jest to przynajmniej w końcu pobieranie wartości, które chcę z mojego przykładowego pliku XML (chociaż formatowanie jest wciąż szalone). Z jakiegoś powodu dostaję przerwy liniowe i dziwne dodatkowe spacje, używając następującego XSLT: , ,

-3

Z mojego doświadczenia wynika, że ​​zawsze wykorzystywane XSLT po stronie klienta rzeczy nie po stronie serwera, który jest to, co wydaje się być próbą z C#

+3

Cóż, ten xslt jest używany przez exe ... ale ogólnie jest * bezpieczniejsze * używanie xslt na serwerze ... to jest bardzo bolesne spróbować napisać xslt do radzić sobie z każdym procesorem xslt w wariancie przeglądarki. –

+0

Może nie bardzo pomocna odpowiedź ... Z pewnością użyłem strony serwera XSLT w Javie do transformacji danych XML. Szybki, wydajny, standardowy. Co zrobić, jeśli klienci nie mogą używać javascript? – Brabster

+0

Może jestem zdezorientowany co do znaczenia XSLT, czy jest to parasol dla wszystkich transformacji XML? Na przykład, jeśli korzystam z biblioteki SimpleXML w PHP, aby przeanalizować niektóre fragmenty XML i wypluć je jako HTML, CSV lub cokolwiek innego, co XSLT? Myślałem, że XSLT to własny język/język –

7

zawsze wolą dać procesowi przeglądarkę XML odciążenie serwera do kontynuuj z bardziej wymagającą pracą. To powiedziawszy, oto przykładowy XSLT, który powinien przetłumaczyć twój XML i zaprezentować go w formacie CSV, jak pokazano powyżej.

Mam nadzieję, że ten przykładowy kod pomoże, jeśli nie, daj mi znać.

<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

Przykro mi, ale to nie zadziała, ponieważ twój kod spowodowałby trzy dodatkowe przerwy w linii. Rozważ użycie dla przecinków. – alamar

+1

Dzięki za komentarz, alamar. Na moim blogu opublikowałem całe rozwiązanie, proszę spojrzeć i daj mi znać, jeśli nadal występują przerwy w linii. Wyjaśniłem również kilka rzeczy, które możesz chcieć wiedzieć o wynikach. Oto post: http: //www.jroller.com/evans/entry/using_xslt_to_transform_xml –

+0

Byłoby lepiej po prostu umieścić "," i "[" we własnych elementach xsl: value-of. To pozwoli Ci sformatować go tak, jak chcesz, a nie wprowadzać dodatkowych podziałów linii. Właściwie ... będę edytować ten format. – jsight

Powiązane problemy