2009-11-22 11 views
19

XSLT初心者の質問:以下のC#コード断片中に空白を入力してください:C#でXSLTを使用してXMLをHTMLに変換する最も簡単な方法は?

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

ありがとう!

答えて

35

方法について:理想的には、CachéうとXslCompiledTransformを再使用

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

注 - または多分(それは非推奨としてマークされている、しかし)の代わりにXslTransformを使用しています。ちょうど楽しみのため

+3

1:それはこれ以上シンプルなを得ることはありませんが。 – Dathan

+0

マーク、あなたは男の中の王子です。 :) –

+0

非常にきれいでシンプルです。 – Chris

4

、マルクによって提案されたキャッシュを実装やや少ないエレガントバージョン:

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

辞書の周りのスレッドの安全性/同期について心配する必要がありますが、はい。 –

+0

そして、xsltStringをハッシュしてそのハッシュをキーとして使う価値があるかもしれません。 XslCompiledTransformでコンパイルされたフォームに格納し、キーとして再びメモリペナルティを格納する理由はありません。 – Dathan

関連する問題