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("<br>", "<BR/>");