2009-08-28 2 views
1

В настоящее время у меня есть некоторые унаследованного ASP.NET 2.0 код, который использует веб-управления ASP Xml так:Как заменить ASP.NET XML WebControl так на использование XslCompiledTransform?

<asp:Xml ID="XmlResult" runat="server" /> 

Это используется для выполнения преобразования XSLT в C# код-за так:

XslTransform xslt = new XslTransform(); 
xslt.Load(Server.MapPath("~/xslt/MyXsltFile.xslt")); 
XmlResult.Transform = xslt; 
XmlResult.TransformArgumentList = xslArgs; // these are created elsewhere 

XmlResult.XPathNavigator = xd.CreateNavigator(); // xd is an XmlDocument() 

проблема заключается в том, что управление XML ASP ожидает XltTransform object и это является устаревшим (помечен как устаревший), как от NET 2.0:

«класс XslTransform есть о bsolete in версия Microsoft .NET Framework 2.0. Класс XslCompiledTransform является новый процессор XSLT.»

Однако, я не могу показаться, чтобы выяснить, как заменить это использовать XslCompiledTransform объект. Очевидно, что вы можете просто дать XmlResult.Transform свойство объекта XslCompiledTransoform как это не будет работать.Таким образом, вероятно, придется заменить элемент управления ASP Xml чем-то еще? Литерал? Заполнитель? Но тогда что ...? Я просто не могу найти лучший способ сделать это.

Любая помощь была бы оценена! Спасибо.

ответ

0

Я, наконец, понял это и думал, что дам ответ, если он окажется полезным для других. Ниже приведен небольшой вспомогательный класс, который использует XsltCompiledTransform, а также может кэшировать результаты. Это было написано специально для кэширования макросов Umbraco, но я могу использовать их в любой ситуации.

public static class XsltHelper 
{ 
    /// <summary> 
    /// Returns a compiled XSLT transform object for an XSLT file and caches it 
    /// </summary> 
    /// <param name="XsltFile">The relative path to the XSLT file</param> 
    /// <returns>An XslCompiledTransform object for the XSLT file</returns> 
    public static XslCompiledTransform GetXslt(string XsltFile) 
    { 
     string cacheKey = "macroXslt_" + XsltFile; 

     if (System.Web.HttpRuntime.Cache[cacheKey] != null) 
     { 
      return (XslCompiledTransform)System.Web.HttpRuntime.Cache[cacheKey]; 
     } 
     else 
     { 
      return GetXSLT(XsltFile, cacheKey); 
     } 
    } 

    private static XslCompiledTransform GetXSLT(string XsltFile, string cacheKey) 
    { 
     XslCompiledTransform macroXSLT = new XslCompiledTransform(); 

     using (XmlTextReader xslReader = new XmlTextReader(System.Web.HttpContext.Current.Server.MapPath(XsltFile))) 
     { 
      try 
      { 
       xslReader.EntityHandling = EntityHandling.ExpandCharEntities; 
       XmlUrlResolver xslResolver = new XmlUrlResolver(); 
       xslResolver.Credentials = CredentialCache.DefaultCredentials; 

       XsltSettings settings = new XsltSettings(); 
       settings.EnableDocumentFunction = true; 
       settings.EnableScript = true; 
       macroXSLT.Load(xslReader, settings, xslResolver); 

       System.Web.HttpRuntime.Cache.Insert(cacheKey, macroXSLT, 
        new System.Web.Caching.CacheDependency(System.Web.HttpContext.Current.Server.MapPath(XsltFile))); 
      } 
      catch 
      { 
       throw; 
      } 
     } 

     return macroXSLT; 
    } 

}

2

Это вспомогательная функция от my library on CodePlex, которая может вам помочь:

public static string GetXslString(IXPathNavigable xslSet, XsltArgumentList xslArgs, IXPathNavigable navigableSet) 
{ 
     XslCompiledTransform xslt = new XslCompiledTransform(false); 
     xslt.Load(xslSet); 

     string ret = null; 

     using(MemoryStream ms = new MemoryStream()) 
     { 
      xslt.Transform(navigableSet, xslArgs, ms); 
      ms.Position = 0; 

      ret = XmlUtility.GetText(ms); 
     } 
     return ret; 
} 
+0

Спасибо, я буду стараться, что в понедельник и посмотреть, если это помогает ... –

Смежные вопросы