Как заменить ASP.NET XML WebControl, так что при использовании XslCompiledTransform? - PullRequest
1 голос
/ 28 августа 2009

В настоящее время у меня есть устаревший код ASP.NET 2.0, который использует веб-элемент управления ASP Xml, например:

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

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

"Класс XslTransform устарел в версия Microsoft .NET Framework 2,0. Класс XslCompiledTransform является новым процессором XSLT. "

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

Любая помощь будет принята с благодарностью! Спасибо.

Ответы [ 2 ]

2 голосов
/ 28 августа 2009

Это вспомогательная функция из моей библиотеки на 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 голосов
/ 23 апреля 2010

Я наконец понял это и решил дать ответ, если он окажется полезным для других. Ниже приведен небольшой вспомогательный класс, который использует 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;
    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...