从 XslTransform 类迁移

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

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

性能

XslCompiledTransform 类在性能方面进行了许多改进。 新的 XSLT 处理器将 XSLT 样式表编译为公共中间格式,与公共语言运行库 (CLR) 对其他编程语言的操作类似。 样式表编译后,可以缓存并重复使用。

XslCompiledTransform 类还进行了其他优化,使其比 XslTransform 类快得多。

注意

尽管 XslCompiledTransform 类的总体性能优于 XslTransform 类,但在首次对转换调用时,Load 类的 XslCompiledTransform 方法可能比 Load 类的 XslTransform 方法慢。 这是因为必须先编译 XSLT 文件,才能加载该文件。 有关详细信息,请参阅以下博客文章:XslCompiledTransform Slower than XslTransform?(XslCompiledTransform 比 XslTransform 慢?)

安全性

默认情况下,XslCompiledTransform 类禁用对 XSLT document() 函数和嵌入式脚本的支持。 通过创建启用这些功能的 XsltSettings 对象并将其传递给 Load 方法,可以启用这些功能。 下面的示例演示如何启用脚本并执行 XSLT 转换。

注意

只有 .NET Framework 支持脚本块。 .NET Core 或 .NET 5(或更高版本)不支持它们。

// 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");
' 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")

有关详细信息,请参阅 XSLT 安全注意事项

新增功能

临时文件

在 XSLT 处理过程中有时会生成临时文件。 如果样式表包含脚本块或是在将调试设置设为 true 时进行编译的,则可能会在 %TEMP% 文件夹中创建临时文件。 可能会存在由于计时问题而不删除某些临时文件的情况。 例如,如果文件正在由当前的 AppDomain 或调试器使用,则 TempFileCollection 对象的终结器将无法移除这些文件。

TemporaryFiles 属性可用于进行附加清理,以确保从客户端中移除所有临时文件。

对 xsl:output 元素和 XmlWriter 的支持

在将转换输出发送到 XslTransform 对象时,xsl:output 类忽略 XmlWriter 设置。 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:using 元素中具有 msxsl:assemblymsxsl:script 子元素。 msxsl:usingmsxsl:assembly 元素用于声明其他命名空间和程序集,以便在脚本块中使用。 有关详细信息,请参阅使用 msxsl:script 的脚本块

XslCompiledTransform 禁止扩展对象具有相同数量的自变量的多个重载。

MSXML 函数

已向 XslCompiledTransform 类添加对其他 MSXML 函数的支持。 下面的列表说明新增或改进功能:

请参阅