2009-11-22 10 views
19

XSLT newbie Frage: Bitte füllen Sie den freien Raum in dem # Code-Fragment C unter:Einfachste Möglichkeit, XML mit XSLT in C# in HTML zu transformieren?

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. 
} 

Dank!

Antwort

35

Wie wäre:

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

Beachten Sie, dass im Idealfall würden Sie Cache und Wiederverwendung der XslCompiledTransform - oder vielleicht verwenden XslTransform statt (es markiert ist als veraltet, obwohl).

+3

+1: Es ist nicht einfacher als diese. – Dathan

+0

Marc, du bist ein Prinz unter den Männern. :) –

+0

Sehr ordentlich und einfach. – Chris

4

Just for fun, eine etwas weniger elegante Version, die das Caching von Marc vorgeschlagen implementiert:

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

Sie müssten sich um Thread-Sicherheit/Synchronisation rund um das Wörterbuch kümmern, aber etwas in diese Richtung, Ja. –

+0

Und es kommt mir vor, dass es sich lohnen könnte, den xsltString zu hashen und stattdessen diesen Hash als Schlüssel zu verwenden. Einige Transformationen können ziemlich groß werden - kein Grund, die zusätzliche Speicherstrafe zu erleiden, indem sie in kompilierter Form in der XslCompiledTransform und wieder als Schlüssel gespeichert wird. – Dathan

Verwandte Themen