2009-06-04 39 views
11

Estoy tratando de escribir un XSLT que transformará un documento XML que tengo en un archivo CSV. He aquí una muestra del XML:¿Cómo escribo un XSLT para transformar XML a 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> 

Lo que quiero es un XSLT que a la salida de este modo:

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

creo que tengo el código C# correcta para iniciar la transformación, pero por si acaso yo no, esto es que el código así:

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

Respuesta

17

crear una plantilla que coincida con todos los usuarios, a continuación, extraiga la información que necesita en el orden que desee:

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

Obviamente, deberá asegurarse de que los espacios en blanco se manejen de la manera que desea, con líneas nuevas en los lugares correctos. Dejaré esto como un ejercicio para el lector.

+0

Gracias. Al menos finalmente está recuperando los valores que quiero de mi archivo XML de muestra (aunque el formateo todavía es una locura). Por alguna razón, estoy obteniendo saltos de línea y extraños espacios extra usando el siguiente XSLT: , ,

-3

En mi experiencia siempre he utilizado XSLT en el lado del cliente de lo que no del lado del servidor que es lo que parece estar tratando con C#

+3

Bueno, ese xslt se usa desde un exe ... pero en general es * más seguro * usar xslt en el servidor ... es muy doloroso intentar escribir xslt en lidiar con el procesador xslt de cada variante de navegador. –

+0

Quizás no sea una respuesta muy útil ... Sin duda, he usado el lado del servidor XSLT en Java para transformar datos XML. Rápido, eficiente, estándar. ¿Qué pasa si tus clientes no pueden usar javascript? – Brabster

+0

Quizás estoy confundido sobre el significado de XSLT, ¿es un paraguas para todas y cada una de las transformaciones XML? Por ejemplo, si uso la biblioteca SimpleXML de PHP para analizar a través de algún XML y escupirlo como HTML, CSV o lo que sea que se considere XSLT? Pensé que XSLT era su propio marcado/lenguaje –

7

siempre prefiero dejar que el proceso del navegador XML aliviar el servidor de continuar con un trabajo más exigente. Dicho esto, aquí hay un ejemplo de XSLT que debe traducir su XML y presentarlo en formato CSV como se muestra arriba.

Espero que este código de ejemplo ayude, si no, házmelo saber.

<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

Lo siento, pero eso no va a funcionar, porque su código haría tres saltos de línea adicionales. Considere usar para comas. – alamar

+1

Gracias por tu comentario, alamar. He publicado toda la solución en mi blog, por favor eche un vistazo y avíseme si todavía está experimentando algún salto de línea. También he explicado algunas cosas que tal vez quiera saber sobre la salida. Aquí está la publicación: http: //www.jroller.com/evans/entry/using_xslt_to_transform_xml –

+0

Habría sido mejor simplemente poner ',' y '[' en sus propios elementos xsl: value-of. Eso te permitirá formatearlo como quieras y no introducir saltos de línea adicionales. En realidad ... lo editaré a ese formato. – jsight

Cuestiones relacionadas