共用方式為


從 XslTransform 類別移轉

XSLT 架構已在 Visual Studio 2005 版本中重新設計。 類別 XslTransform 已由 XslCompiledTransform 類別取代。

以下各節將說明XslCompiledTransform類別和XslTransform類別之間的一些主要差異。

績效

類別 XslCompiledTransform 包含許多效能改善。 新的 XSLT 處理器會將 XSLT 樣式表單編譯成通用中繼格式,類似於 Common Language Runtime (CLR) 對其他程式設計語言所做的工作。 編譯樣式表單之後,就可以快取並重複使用。

類別 XslCompiledTransform 也包含其他優化,使其比 XslTransform 類別更快。

備註

雖然 XslCompiledTransform 類別的整體效能優於 XslTransform 類別,但在首次進行轉換呼叫時,Load 類別的 XslCompiledTransform 方法執行速度可能比 Load 類別的 XslTransform 方法慢。 這是因為必須先編譯 XSLT 檔案,才能載入它。 如需詳細資訊,請參閱下列部落格文章: 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 可以產生偵錯資訊,這可讓您使用Visual Studio調試程式 Microsoft對樣式表單進行偵錯。 如需相關資訊,請參閱 XslCompiledTransform(Boolean)

行為差異

轉換成 XmlReader

類別 XslTransform 有數個 Transform 多載,可將轉換結果傳回為 XmlReader 物件。 這些重載可用來將轉換結果載入記憶體中的表示形式(例如 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 中,腳本函式的系結(方法名稱查閱)會在編譯時期發生,且使用 XslTransform 的樣式表在載入 XslCompiledTransform 時可能會造成例外狀況。

XslCompiledTransform 支援在 msxsl:using 元素內包含 msxsl:assemblymsxsl:script 子元素。 msxsl:usingmsxsl:assembly 元素可用來宣告其他命名空間和元件,以在腳本區塊中使用。 如需詳細資訊,請參閱 使用 msxsl:script 撰寫區塊腳本

XslCompiledTransform 禁止具有相同數量參數的多重多載擴充物件。

MSXML 函式

已將其他 MSXML 函式的支援新增至 類別 XslCompiledTransform 。 下列清單描述新功能或改善的功能:

另請參閱