XSLT アーキテクチャは、Visual Studio 2005 リリースで設計が変更されました。 XslTransform クラスは XslCompiledTransform クラスで置き換えられています。
以降では、XslCompiledTransform クラスと XslTransform クラスの主な相違点について説明します。
パフォーマンス
XslCompiledTransform クラスでは多くのパフォーマンスの向上が図られています。 新しい XSLT プロセッサは XSLT スタイル シートを、共通言語ランタイム (CLR) が他のプログラム言語で行うのと同様に、共通の中間形式にコンパイルします。 いったんスタイル シートがコンパイルされると、それをキャッシュして再利用することができます。
XslCompiledTransform クラスには、このクラスを XslTransform クラスよりも大幅に高速化する他の最適化も含まれています。
![]() |
---|
全体的なパフォーマンスは XslCompiledTransform クラスの方が XslTransform クラスより優れていますが、XslCompiledTransform クラスの Load メソッドが変換で初めて呼び出されたときは、XslTransform クラスの Load メソッドよりパフォーマンスが劣る場合があります。これは、XSLT ファイルを読み込む前にコンパイルする必要があるためです。詳細については、ブログの投稿「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 クラスには、スタイル シートの xsl:output 要素から取得された出力情報を含む XmlWriterSettings オブジェクトを返す OutputSettings プロパティがあります。 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 では、スクリプト関数へのバインド (メソッド名参照) がコンパイル時に実行されます。XslTranform を利用するスタイル シートを XslCompiledTransform によって読み込むと、例外が発生する場合があります。
XslCompiledTransform では、msxsl:script 要素内に子要素として msxsl:using および msxsl:assembly を含めることがサポートされます。 msxsl:using 要素と msxsl:assembly 要素を使用して、スクリプト ブロックで使用する追加の名前空間とアセンブリを宣言できます。 詳細については、「msxsl:script を使用したスクリプト ブロック」を参照してください。
XslCompiledTransform では、複数のオーバーロードおよびそれと同数の引数を含む拡張オブジェクトは使用できません。
MSXML 関数
XslCompiledTransform クラスでは、新しい MSXML 関数のサポートが追加されました。 新しい関数または強化された関数は次のとおりです。
msxsl:node-set : XslTransform では、msxsl: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 ではネイティブでサポートされません。 ただし、拡張関数として実装することはできます。