2009-11-22 19 views
19

XSLT pregunta novato: Por favor llene el espacio en el fragmento de código C# a continuación:¿La forma más simple de transformar XML a HTML con XSLT en C#?

public static string TransformXMLToHTML(string inputXml, string xsltString) { 
    // insert code here to apply the transform specified by xsltString to inputXml 
    // and return the resultant HTML string. 
    // You may assume that the xslt output type is HTML. 
} 

Gracias!

Respuesta

35

¿Qué tal:

public static string TransformXMLToHTML(string inputXml, string xsltString) 
{ 
    XslCompiledTransform transform = new XslCompiledTransform(); 
    using(XmlReader reader = XmlReader.Create(new StringReader(xsltString))) { 
     transform.Load(reader); 
    } 
    StringWriter results = new StringWriter(); 
    using(XmlReader reader = XmlReader.Create(new StringReader(inputXml))) { 
     transform.Transform(reader, null, results); 
    } 
    return results.ToString(); 
} 

Tenga en cuenta que lo ideal sería almacenar en caché y volver a utilizar el XslCompiledTransform - o tal vez usar XslTransform lugar (que es marcado como obsoleto, sin embargo).

+3

+1: no hay nada más sencillo que esto. – Dathan

+0

Marc, eres un príncipe entre los hombres. :) –

+0

Muy limpio y simple. – Chris

4

Sólo por diversión, una versión ligeramente menos elegante que implementa el almacenamiento en caché sugerido por Marc:

public static string TransformXMLToHTML(string inputXml, string xsltString) 
    { 
     XslCompiledTransform transform = GetAndCacheTransform(xsltString); 
     StringWriter results = new StringWriter(); 
     using (XmlReader reader = XmlReader.Create(new StringReader(inputXml))) 
     { 
      transform.Transform(reader, null, results); 
     } 
     return results.ToString(); 
    } 

    private static Dictionary<String, XslCompiledTransform> cachedTransforms = new Dictionary<string, XslCompiledTransform>(); 
    private static XslCompiledTransform GetAndCacheTransform(String xslt) 
    { 
     XslCompiledTransform transform; 
     if (!cachedTransforms.TryGetValue(xslt, out transform)) 
     { 
      transform = new XslCompiledTransform(); 
      using (XmlReader reader = XmlReader.Create(new StringReader(xslt))) 
      { 
       transform.Load(reader); 
      } 
      cachedTransforms.Add(xslt, transform); 
     } 
     return transform; 
    } 
+0

Tendría que preocuparse por la seguridad/sincronización de hilos alrededor del diccionario, pero algo similar a eso, sí. –

+0

Y se me ocurre que podría valer la pena copiar el xsltString y usar ese hash como clave en su lugar. Algunas transformaciones pueden ser bastante grandes, no hay razón para incurrir en la pena de memoria extra almacenándola en forma compilada en XslCompiledTransform y nuevamente como la clave. – Dathan

Cuestiones relacionadas