2009-11-22 10 views

Odpowiedz

35

Jak o:

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

Zauważ, że idealnie byś cache i ponownie wykorzystać XslCompiledTransform - czy może wykorzystać XslTransform zamiast (jest on oznaczony jako przestarzałe, choć).

+3

+1: to nigdy nie było prostsze. – Dathan

+0

Marc, jesteś księciem wśród mężczyzn. :) –

+0

Bardzo schludny i prosty. – Chris

4

Tylko dla zabawy, nieco mniej elegancki wersja, która implementuje buforowania sugerowanego przez 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

Musisz się martwić o bezpieczeństwo wątku/synchronizację wokół słownika, ale coś podobnego, tak. –

+0

I wydaje mi się, że warto byłoby zahaczyć xsltString i zamiast tego użyć tego skrótu jako klucza. Niektóre transformacje mogą stać się całkiem duże - nie ma powodu, by ponosić dodatkową karę pamięci przechowującą ją w postaci skompilowanej w XslCompiledTransform i znowu jako klucz. – Dathan

Powiązane problemy