XslTransform против XslCompiledTransform

XslTransform, по-видимому, устарел от Microsoft в пользу XslCompiledTransform. Теоретически, если я выполнял только одно преобразование во время выполнения моего приложения, не должна ли интерпретация XSLT (через XslTransform) быть быстрее, чем компиляция? Если да, то xsltransform написан настолько плохо, что улучшения, внесенные в XslCompiledTransform, более чем компенсируют это?

5 ответов


вы можете увидеть документированные различия между XslTransform и XslCompiledTransform здесь и здесь, и принять решение самостоятельно.

кроме того, в некоторых случаях XslTransform является более несогласованным. Была проделана дополнительная работа по безопасности в XslCompiledTransform.

итак, много причин, по которым следует рассмотреть использование нового XslCompiledTransform вместо старого XslTransform, даже в случаях, когда преобразование будет выполняться только один раз и может быть немного быстрее со старой XslTransform.


Ну, у вас есть (медленное) время работы XslTransform против времени компиляции XslCompiledTransform плюс его (быстрое) время работы. Нет теоретического способа решить это сравнение окончательно.

теория предполагает: время работы зависит от входных и требуемых операций, а время компиляции зависит от сложности XSLT. Практика подтверждает, что при тривиальном вводе и сложном XSLT однократное выполнение XslTransform определенно будет быстрее.

для всех реальные приложения вы хотите XslCompiledTransform хотя бы за то, что XslTransform устарел и может очень хорошо содержать недостатки, которые никогда не будут исправлены. На самом деле у меня были таблицы стилей, которые странно вели себя под XslTransform и отлично работали под XslCompiledTransform.

Как несвязанная точка данных, я просто потратил пару часов на отладку XSLT, который раньше работал нормально и больше не работал. Оказалось, что XSLT был в порядке, проблема заключалась в том, что код, который применял его, был обновлен от XslTransform (который работал отлично) до XslCompiledTransform (который плохо преобразует его), некоторое время назад, и это вызвало ошибку.

итак, не доволен тем, что Xsltransform устарел, здесь, так как мне просто пришлось вернуть код для его использования... :(


вы должны использовать XslCompiledTransform в любом случае, так как XslTransform амортизируется и может быть удален из будущих версий платформы.


У обоих есть свои плюсы и минусы. Я использую оба, но в другом сценарии. Я использую XslTransform для передачи вывода в переменную управления XML и записи вывода в литеральный элемент управления, но когда мне нужно передать XML-элемент управления на странице, мне нужно XslCompiledTransform. Это связано с тем, что выходные данные обоих методов различны.

  System.Web.UI.WebControls.Xml objXML = new System.Web.UI.WebControls.Xml();
        System.IO.StringWriter objTextWriter = new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter objHtmlTextWriter = new System.Web.UI.HtmlTextWriter(objTextWriter);
        XslTransform objTrans = new XslTransform();
        objTrans.Load(HttpContext.Current.Server.MapPath(strXslFileName));
        objXML.TransformArgumentList = objArgsList;
        objXML.Transform = objTrans;
        objXML.Document = objOutputXml;
        objXML.RenderControl(objHtmlTextWriter);
        return objTextWriter.ToString();



 XslCompiledTransform objTrans = new System.Xml.Xsl.XslCompiledTransform();
        System.IO.StringWriter objStringReader = new System.IO.StringWriter();
        objTrans.Load(HttpContext.Current.Server.MapPath(strXslFileName));
        objTrans.Transform(objOutputXml, objArgsList, objStringReader);
        return objStringReader.ToString().Replace("&lt;br&gt;", "<BR/>");