从 XslTransform 类迁移

在 Visual Studio 2005 版本中重新设计了 XSLT 体系结构。 XslTransform 类已被 XslCompiledTransform 类所取代。

以下各节说明 XslCompiledTransformXslTransform 类之间的一些主要区别。

性能

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 重载。 这些重载可用于将转换结果加载到内存表示形式(如 XmlDocumentXPathDocument),而不会增加对生成的 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 函数的支持。 下面的列表说明新增或改进功能:

请参见

其他资源

XSLT 转换

使用 XslCompiledTransform 类