Language

XslTransform クラスからの移行

XSLT アーキテクチャは、Visual Studio 2005 リリースで再設計されました。 XslTransform クラスは、XslCompiledTransform クラスに置き換えられました。

次のセクションでは、 XslCompiledTransform クラスと XslTransform クラスの主な違いについて説明します。

[パフォーマンス]

XslCompiledTransform クラスには、多くのパフォーマンスの向上が含まれています。 新しい XSLT プロセッサは、共通言語ランタイム (CLR) が他のプログラミング言語に対して実行するのと同様に、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 クラスには、変換結果を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 変換 (XSLT) バージョン 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 関数のサポートが追加されました。 次の一覧では、新機能または改善された機能について説明します。

こちらも参照ください