2009-11-22 47 views

Trả lời

35

Làm thế nào về:

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

Lưu ý rằng lý tưởng bạn sẽ bộ nhớ cache và tái sử dụng XslCompiledTransform - hoặc có lẽ sử dụng XslTransform thay vì (nó được đánh dấu là bị phản đối, mặc dù).

+3

+1: nó không nhận được bất kỳ đơn giản hơn này. – Dathan

+0

Marc, bạn là một hoàng tử ở nam giới. :) –

+0

Rất gọn gàng và đơn giản. – Chris

4

Chỉ cần cho vui, một phiên bản hơi ít thanh lịch mà thực hiện các bộ nhớ đệm được đề xuất bởi 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

Bạn sẽ phải lo lắng về an toàn/đồng bộ hóa luồng trên từ điển, nhưng Vâng. –

+0

Và nó xảy ra với tôi rằng nó có thể là đáng giá để băm xsltString và sử dụng băm đó như là một chìa khóa để thay thế. Một số biến đổi có thể nhận được khá lớn - không có lý do để gánh chịu thêm hình phạt bộ nhớ lưu trữ nó trong hình thức biên dịch trong XslCompiledTransform và một lần nữa như là chìa khóa. – Dathan

Các vấn đề liên quan