XslTransform クラスからの移行
XSLT アーキテクチャは、Visual Studio 2005 リリースで設計が変更されました。 XslTransform クラスは XslCompiledTransform クラスで置き換えられました。
以降では、XslCompiledTransform クラスと XslTransform クラスの主な相違点について説明します。
パフォーマンス
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 オーバーロードが数種類あります。 このオーバーロードを使用することで、生成される XML ツリーのシリアル化と逆シリアル化によるオーバーヘッドを生じることなく、変換結果をメモり内表現 (XmlDocument または XPathDocument) に読み込むことができます。 次の 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 メソッドを使用して、生成される XML ツリーを XmlWriter から直接読み込むことはできます。 次の 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 Transformations (XSLT) Version 1.0』には、対処方法を実装者が決定できる事項があります。 このような事項は、随意動作と見なされています。 事項によっては、XslCompiledTransform クラスと XslTransform クラスで動作が異なります。 詳しくは、「XSLT エラーの解決」をご覧ください。
拡張オブジェクトとスクリプト関数
XslCompiledTransform では、スクリプト関数の使用に関して新たに 2 つの制限が加えられています。
XPath 式からはパブリック メソッドのみを呼び出すことができる。
オーバーロードは引数の数に基づいて区別される。 引数の数が同じオーバーロードが複数存在する場合、例外が発生します。
XslCompiledTransform では、スクリプト関数へのバインド (メソッド名参照) がコンパイル時に実行されます。XslTransform を利用するスタイル シートを XslCompiledTransform によって読み込むと、例外が発生する場合があります。
XslCompiledTransform では、msxsl:using
要素内に子要素として msxsl:assembly
および msxsl:script
を含めることがサポートされます。 msxsl:using
要素と msxsl:assembly
要素を使用して、スクリプト ブロックで使用する追加の名前空間とアセンブリを宣言できます。 詳しくは、「msxsl:script を使用したスクリプト ブロック」をご覧ください。
XslCompiledTransform では、複数のオーバーロードおよびそれと同数の引数を含む拡張オブジェクトは使用できません。
MSXML 関数
XslCompiledTransform クラスでは、新しい MSXML 関数のサポートが追加されました。 新しい関数または強化された関数は次のとおりです。
msxsl:node-set: XslTransform では、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 でネイティブ サポートされません。 ただし、拡張関数として実装することはできます。
関連項目
.NET