共用方式為


從 XslTransform 類別移轉

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

下列章節將說明 XslCompiledTransformXslTransform 類別之間的一些主要差異。

效能

XslCompiledTransform 類別包括許多效能改進。 類似於 Common Language Runtime (CLR) 處理其他程式設計語言的方式,新版 XSLT 處理器會將 XSLT 樣式表編譯成常見的中繼格式。 樣式表一旦編譯完畢,便可對其進行快取及重複使用。

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 類別可以產生偵錯資訊,此資訊可讓您使用 Microsoft Visual Studio 偵錯工具來偵錯樣式表。 如需相關資訊,請參閱 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);
}

Discretionary 行為

<W3C XSL 轉換 (XSLT) 1.0 版建議事項>中所包含的領域,可告訴實作提供者該採取哪些決策來處理哪種狀況。 這些領域視為 Discretionary 行為。 在幾個領域中,XslCompiledTransform 的行為與 XslTransform 類別有一些差異。 如需詳細資訊,請參閱可復原的 XSLT 錯誤

擴充物件和指令碼函式

XslCompiledTransform 對於指令碼函式的使用引入兩項新的限制:

  • 只有公用方法才可以從 XPath 運算式呼叫。

  • 多載可根據引數的數目彼此區分。 如果有一個以上的多載具有相同的引數數目,將會引發例外狀況。

XslCompiledTransform 中,繫結 (方法名稱查閱) 至指令碼函式會在編譯時期發生,當使用 XslTranform 的樣式表是以 XslCompiledTransform 載入時,可能會導致例外狀況。

XslCompiledTransform 支援在 msxsl:using 項目內有 msxsl:assemblymsxsl:script 子項目。 msxsl:usingmsxsl:assembly 項目是用來宣告要在指令碼區塊內使用的其他命名空間和組件。 如需詳細資訊,請參閱使用 msxsl:script 的指令碼區塊

XslCompiledTransform 禁止具有多個多載的擴充物件有相同的引數數目。

MSXML 函式

其他 MSXML 函式的支援已加入到 XslCompiledTransform 類別中。 下列清單說明新的或改良的功能:

另請參閱