XslTransform 似乎已被 Microsoft 弃用,取而代之的是 XslCompiledTransform。从理论上讲,如果我在执行应用程序期间只进行一次转换,那么解释 XSLT(通过 XslTransform)不应该比编译它更快吗?如果是这样,XslTransform 是否写得如此糟糕以至于对 XslCompiledTransform 所做的改进足以弥补它?
5 回答
好吧,你有 XslTransform 的(慢)运行时间与 XslCompiledTransform 的编译时间加上它的(快速)运行时间。没有理论上的方法可以最终决定这种比较。
理论表明:运行时间取决于输入和所需的操作,而编译时间取决于 XSLT 的复杂性。实践证实,使用微不足道的输入和复杂的 XSLT 一次执行 XslTransform 肯定会更快。
但是,对于所有实际应用程序,您将需要 XslCompiledTransform,前提是 XslTransform 已被弃用并且很可能包含永远无法修复的缺陷。实际上,我有一些样式表在 XslTransform 下表现异常,并且在 XslCompiledTransform 下完美运行。
在任何情况下都应该使用 XslCompiledTransform,因为 XslTransform 已被贬低,并且可能会从框架的未来版本中删除。
作为一个不相关的数据点,我只是浪费了几个小时来调试一个以前可以正常工作但现在不再正常工作的 XSLT。结果证明 XSLT 很好,问题是应用它的代码在不久前从 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/>");