从 XslTransform 类迁移
在 Visual Studio 2005 版本中重新设计了 XSLT 体系结构。 XslTransform 类已被 XslCompiledTransform 类所取代。
以下各节说明 XslCompiledTransform 和 XslTransform 类之间的一些主要区别。
性能
XslCompiledTransform 类在性能方面进行了许多改进。 新的 XSLT 处理器将 XSLT 样式表编译为公共中间格式,与公共语言运行库 (CLR) 对其他编程语言的操作类似。 样式表编译后,可以缓存并重复使用。
XslCompiledTransform 类还进行了其他优化,使其比 XslTransform 类快得多。
注意 |
---|
尽管 XslCompiledTransform 类的总体性能优于 XslTransform 类,但在首次对转换调用时,XslCompiledTransform 类的 Load 方法可能比 XslTransform 类的 Load 方法慢。这是因为必须先编译 XSLT 文件,才能加载该文件。有关更多信息,请参见以下博客帖子:XslCompiledTransform Slower than XslTransform?(XslCompiledTransform 比 XslTransform 慢?) |
安全性
默认情况下,XslCompiledTransform 类禁用对 XSLT document() 函数和嵌入式脚本的支持。 通过创建启用这些功能的 XsltSettings 对象并将其传递给 Load 方法,可以启用这些功能。 下面的示例演示如何启用脚本并执行 XSLT 转换。
' Create the XsltSettings object with script enabled.
Dim settings As New XsltSettings(False, True)
' Execute the transform.
Dim xslt As New XslCompiledTransform()
xslt.Load("calc.xsl", settings, New XmlUrlResolver())
xslt.Transform("books.xml", "books.html")
// Create the XsltSettings object with script enabled.
XsltSettings settings = new XsltSettings(false,true);
// Execute the transform.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("calc.xsl", settings, new XmlUrlResolver());
xslt.Transform("books.xml", "books.html");
有关更多信息,请参见 XSLT 安全注意事项。
新功能
临时文件
在 XSLT 处理过程中有时会生成临时文件。 如果样式表包含脚本块或是在将调试设置设为 true 时进行编译的,则可能会在 %TEMP% 文件夹中创建临时文件。 可能会存在由于计时问题而不删除某些临时文件的情况。 例如,如果文件正在由当前的 AppDomain 或调试器使用,则 TempFileCollection 对象的终结器将无法移除这些文件。
TemporaryFiles 属性可用于进行附加清理,以确保从客户端中移除所有临时文件。
对 xsl:output 元素和 XmlWriter 的支持
在将转换输出发送到 XmlWriter 对象时,XslTransform 类忽略 xsl:output 设置。 XslCompiledTransform 类具有一个 OutputSettings 属性,它可返回一个 XmlWriterSettings 对象,该对象包含从样式表的 xsl:output 元素派生的输出信息。 XmlWriterSettings 对象用于创建具有正确设置的 XmlWriter 对象,可将该对象传递给 Transform 方法。 下面的 C# 代码阐释这一行为:
// Create the XslTransform object and load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(stylesheet);
// Load the file to transform.
XPathDocument doc = new XPathDocument(filename);
// Create the writer.
XmlWriter writer = XmlWriter.Create(Console.Out, xslt.OutputSettings);
// Transform the file and send the output to the console.
xslt.Transform(doc, writer);
writer.Close();
调试选项
XslCompiledTransform 类可以生成调试信息,使您可以使用 Microsoft Visual Studio 调试器调试样式表。 有关更多信息,请参见 XslCompiledTransform(Boolean)。
行为差异
转换为 XmlReader
XslTransform 类具有多个作为 XmlReader 对象返回转换结果的 Transform 重载。 这些重载可用于将转换结果加载到内存表示形式(如 XmlDocument 或 XPathDocument),而不会增加对生成的 XML 树进行序列化和反序列化所造成的开销。 下面的 C# 代码演示如何将转换结果加载到 XmlDocument 对象。
// Load the style sheet
XslTransform xslt = new XslTransform();
xslt.Load("MyStylesheet.xsl");
// Transform input document to XmlDocument for additional processing
XmlDocument doc = new XmlDocument();
doc.Load(xslt.Transform(input, (XsltArgumentList)null));
XslCompiledTransform 类不支持转换为 XmlReader 对象。 不过,通过使用 CreateNavigator 方法直接从 XmlWriter 中加载生成的 XML 树,您可以执行类似操作。 下面的 C# 代码演示如何使用 XslCompiledTransform 完成相同的任务。
// Transform input document to XmlDocument for additional processing
XmlDocument doc = new XmlDocument();
using (XmlWriter writer = doc.CreateNavigator().AppendChild()) {
xslt.Transform(input, (XsltArgumentList)null, writer);
}
任意行为
W3C XSL 转换 (XSLT) 1.0 版建议中涉及到实现提供者可以在哪些方面确定如何处理某种情况。 这些方面被认为是任意行为。 在有些方面,XslCompiledTransform 行为不同于 XslTransform 类。 有关更多信息,请参见可恢复的 XSLT 错误。
扩展对象和脚本函数
XslCompiledTransform 介绍对使用脚本函数的两个新限制:
从 XPath 表达式中只能调用公共方法。
重载之间可以基于参数数量进行区分。 如果多个重载具有相同数量的参数,则将引发异常。
在 XslCompiledTransform 中,脚本函数的绑定(方法名称查找)发生在编译时,当使用 XslCompiledTransform 加载由 XslTranform 使用的样式表时,这些样式表可能会引发异常。
XslCompiledTransform 支持在 msxsl:script 元素中具有 msxsl:using 和 msxsl:assembly 子元素。 msxsl:using 和 msxsl:assembly 元素用于声明其他命名空间和程序集,以便在脚本块中使用。 有关更多信息,请参见使用 msxsl:script 的脚本块。
XslCompiledTransform 禁止扩展对象具有相同数量的参数的多个重载。
MSXML 函数
已向 XslCompiledTransform 类添加对其他 MSXML 函数的支持。 下面的列表说明新增或改进功能:
msxsl:node-set:XslTransform 要求 msxsl:node-set 函数的参数是结果树片段。 XslCompiledTransform 类没有此要求。
msxsl:version:XslCompiledTransform 中支持此函数。
XPath 扩展函数:现在支持 ms:string-compare、ms:utc、ms:namespace-uri、ms:local-name、ms:number、ms:format-date 和 ms:format-time 函数。
与架构相关的 XPath 扩展函数:这些函数不受 XslCompiledTransform 本机支持。 但是,它们可以作为扩展函数实现。