XslTransform与XslCompiledTransform

时间:2009-03-05 01:45:10

标签: .net xslt xslcompiledtransform

XslTransform似乎已被Microsoft弃用,转而使用XslCompiledTransform。从理论上讲,如果我在执行应用程序期间只进行一次转换,那么解释XSLT(通过XslTransform)是否应该比编译它更快?如果是这样,XslTransform是否写得如此糟糕以至于对XslCompiledTransform所做的改进不仅仅是对它的补偿呢?

5 个答案:

答案 0 :(得分:4)

您可能希望查看XslTransformXslCompiledTransform herehere之间记录的差异,并自行做出决定

此外,在某些情况下,XslTransform更不符合要求。在XslCompiledTransform中对安全性做了更多的工作。

因此,有很多原因应该考虑使用新的XslCompiledTransform而不是旧的XslTransform ,即使转化只运行一次也可以使用旧的XslTransform稍快一些。

答案 1 :(得分:2)

嗯,你有XslTransform的(慢)运行时间与XslCompiledTransform的编译时间加上它的(快速)运行时间。没有理论上的方法可以最终决定这种比较。

理论建议:运行时间取决于输入和所需的操作,编译时间取决于XSLT的复杂性。实践证实,通过简单的输入和复杂的XSLT,一次性执行XslTransform肯定会更快。

但是,对于所有实际应用程序,如果只是因为不推荐使用XslTransform并且可能包含永远不会修复的缺陷,那么您将需要XslCompiledTransform。我实际上有一些样式表在XslTransform下表现得很奇怪并且在XslCompiledTransform下运行得很好。

答案 2 :(得分:2)

作为一个不相关的数据点,我浪费了几个小时来调试过去工作正常而不再工作的XSLT。原来XSLT很好,问题是应用它的代码从XslTransform(它工作得很好)更新到XslCompiledTransform(它转换得很糟糕),不久之前,它触发了错误。

所以,不满意XslTransform被废弃,在这里,因为我只需要恢复代码使用它...... :(

答案 3 :(得分:1)

您应该在任何情况下使用XslCompiledTransform,因为XslTransform已被折旧,并且可能会从框架的未来版本中删除。

答案 4 :(得分:0)

两者各有利弊。我在两种情况下都使用它们。我正在使用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/>");