XslTransform クラスによる XSLT プロセッサの実装
XslTransform クラスは、『XSL Transformations (XSLT) Version 1.0 Recommendation』を実装する XSLT プロセッサです。Load メソッドは、スタイル シートの場所を特定し、読み込みます。Transform メソッドは、変換対象のソース ドキュメントを変換します。IXPathNavigable インターフェイスを実装している任意のストアを、XslTransform のソース ドキュメントとして使用できます。.NET Framework では、現在、IXPathNavigable インターフェイスを XmlDocument、XmlDataDocument、および XPathDocument に実装しているので、これらすべてを変換の入力用ソース ドキュメントとして使用できます。
.NET Framework の XslTransform オブジェクトは、次の名前空間で定義される XSLT 1.0 仕様だけをサポートします。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
スタイル シートは、Load メソッドを使用して、次のいずれかのクラスから読み込むことができます。
- XPathNavigator
- XmlReader
- URL を表す文字列
これらの入力クラスには、それぞれ別の Load メソッドがあります。これらのクラスの 1 つと XmlResolver クラスの組み合わせを引数としているメソッドもあります。XmlResolver は、スタイル シート内の <xsl:import>
または <xsl:include>
で参照されるリソースの場所を特定します。次に示すメソッドは、文字列、XmlReader、または XPathNavigator を入力として受け取ります。
Overloads Public Sub Load(String)
[C#]
public void Load(string);
[Visual Basic]
Overloads Public Sub Load(String, XmlResolver)
[C#]
public void Load(string, XmlResolver);
[Visual Basic]
Overloads Public Sub Load(XmlReader, XmlResolver, Evidence)
[C#]
public void Load(XmlReader, XmlResolver, Evidence);
[Visual Basic]
Overloads Public Sub Load(XPathNavigator, XmlResolver, Evidence)
[C#]
public void Load(XPathNavigator, XmlResolver, Evidence);
上に示した Load メソッドの多くは、XmlResolver をパラメータとしています。XmlResolver は、スタイル シート、または xsl:import および xsl:include 要素で参照されているスタイル シートを読み込むときに使います。
多くの Load メソッドでは、Evidence もパラメータとしています。Evidence パラメータは、スタイル シートと関連付けられている System.Security.Policy.Evidence です。スタイル シートのセキュリティ レベルに応じて、スタイル シートに含まれているスクリプト、スタイル シートで使用されている document()
関数、XsltArgumentList で使用されている拡張オブジェクトなど、そのスタイル シートによって参照されているリソースのセキュリティ レベルも変わります。
URL パラメータを含み、Evidence パラメータを含まない Load メソッドを使用してスタイル シートを読み込んだ場合、スタイル シートの証拠は、指定された URL とそのサイトおよびゾーンを組み合わせて計算されます。
URI も Evidence も指定されていない場合は、スタイル シートに設定されている Evidence が完全に信頼されます。信頼されていないソースからスタイル シートを読み込まないでください。また、信頼されていない拡張オブジェクトを XslArgumentList に追加しないでください。
オーバーロードされている Load メソッドの詳細については、「XslTransform.Load メソッド」を参照してください。セキュリティ レベルと Evidence、およびそのスクリプトへの影響の詳細については、「<msxsl:script> を使用した XSLT スタイル シートのスクリプト」を参照してください。セキュリティ レベルと Evidence、およびその拡張オブジェクトへの影響の詳細については、「スタイルシート パラメータと機能拡張オブジェクト用の XsltArgumentList」を参照してください。
セキュリティ レベルと Evidence、およびその document()
関数への影響の詳細については、「外部の XSLT スタイルシートとドキュメントの解決」を参照してください。
スタイル シートに対しては、多くの入力パラメータを指定できます。スタイル シートでは、拡張オブジェクトの関数を呼び出すこともできます。パラメータと拡張オブジェクトは、どちらも XsltArgumentList クラスを使用してスタイル シートに対して指定されます。XsltArgumentList の詳細については、「XsltArgumentList メンバ」を参照してください。
XslTransform クラスの安全な使用方法
スタイル シートのセキュリティ特権は、指定される Evidence によって決まります。スタイル シートの場所と、指定する証拠の種類の説明を次の表に示します。
シナリオ | 指定する証拠の種類 |
---|---|
XSLT スタイル シートに外部参照がない場合。またはスタイル シートが信頼できるコード ベースにある場合。 | アセンブリの証拠を指定します。
|
XSLT スタイル シートが外部ソースにある場合。ソースの出所が知られており、検証可能な URI がある。 | URI を使用して証拠を作成します。
|
XSLT スタイル シートが外部ソースにある場合。ソースの出所は不明。 | 証拠を null 参照 (VB では Nothing) に設定します。スクリプト ブロックは処理されません。XSLT document() 関数はサポートされません。権限を持つ拡張オブジェクトは許可されません。
また、resolver パラメータに null 参照 (Nothing) を設定することもできます。設定すると、 |
XSLT スタイル シートが外部ソースにある場合。ソースの出所が不明であるが、スクリプトのサポートが必要。 | 呼び出し元の証拠を要求します。 |
XML データの変換
スタイルシートが読み込まれた後で、Transform メソッドの 1 つを呼び出し、入力ソース ドキュメントを指定すると、変換が開始されます。Transform メソッドは、さまざまな変換出力を提供できるように、オーバーロードされます。変換の結果として得られる出力形式を次に示します。
- XmlReader
- XmlWriter
- TextWriter
- Stream
- ファイルの文字列 URL
最後に示した文字列 URL 形式は、URL にある入力ドキュメントを変換し、そのドキュメントを出力 URL に書き込む場合に一般的に使用されます。この Transform メソッドは、ファイルから XML ドキュメントを読み込み、XSLT 変換を実行し、その出力をファイルに書き込む場合に便利です。これにより、入力ソース ドキュメントを作成および読み込んでからファイル ストリームに書き込む必要がなくなります。文字列 URL を入出力として使う Transform メソッドを使用するコード例を次に示します。
Dim xsltransform As XslTransform = New XslTransform()
xsltransform.Load("favorite.xsl")
xsltransform.Transform("MyDocument.Xml", "TransformResult.xml", Nothing)
[C#]
XslTransform xsltransform = new XslTransform();
xsltransform.Load("favorite.xsl");
xsltransform.Transform("MyDocument.xml", "TransformResult.xml", null);
XML ドキュメントのセクションの変換
変換はドキュメント全体に対して行われます。つまり、ドキュメント ルート ノード以外のノードを指定しても、変換処理では、読み込んだドキュメントのすべてのノードがアクセスされます。ノード フラグメントを変換するには、ノード フラグメントだけを含む XmlDocument を作成し、その XmlDocument を Transform メソッドに渡します。ノード フラグメントの変換を実行する例を次に示します。
Dim xslt As New XslTransform()
xslt.Load("print_root.xsl")
Dim doc As New XmlDocument()
doc.Load("library.xml")
' Create a new document containing just the node fragment.
Dim testNode As XmlNode = doc.DocumentElement.FirstChild
Dim tmpDoc As New XmlDocument()
tmpDoc.LoadXml(testNode.OuterXml)
' Pass the document containing the node fragment
' to the Transform method.
Console.WriteLine(("Passing " + tmpDoc.OuterXml + " to print_root.xsl"))
xslt.Transform(tmpDoc, Nothing, Console.Out, Nothing)
[C#]
XslTransform xslt = new XslTransform();
xslt.Load("print_root.xsl");
XmlDocument doc = new XmlDocument();
doc.Load("library.xml");
// Create a new document containing just the node fragment.
XmlNode testNode = doc.DocumentElement.FirstChild;
XmlDocument tmpDoc = new XmlDocument();
tmpDoc.LoadXml(testNode.OuterXml);
// Pass the document containing the node fragment
// to the Transform method.
Console.WriteLine("Passing " + tmpDoc.OuterXml + " to print_root.xsl");
xslt.Transform(tmpDoc, null, Console.Out, null);
この例では、library.xml ファイルと print_root.xsl ファイルを入力とし、次に示す結果をコンソールに出力します。
Passing <book genre="novel" ISBN="1-861001-57-5"><title>Pride And Prejudice</title></book> to print_root.xsl
Root node is book.
library.xml
<library>
<book genre='novel' ISBN='1-861001-57-5'>
<title>Pride And Prejudice</title>
</book>
<book genre='novel' ISBN='1-81920-21-2'>
<title>Hook</title>
</book>
</library>
print_root.xsl
<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform" >
<output method="text" />
<template match="/">
Root node is <value-of select="local-name(//*[position() = 1])" />
</template>
</stylesheet>
.NET Framework Version 1.0 から .NET Framework Version 1.1 への XSLT の移行
次の表は、XslTransform.Load について、.NET Framework Version 1.0 の廃止されたメソッドと、.NET Framework Version 1.1 の新しいメソッドを示しています。新しいメソッドでは、証拠を指定することにより、スタイル シートのアクセス許可を制限できます。
.NET Framework Version 1.0 での Load メソッド | .NET Framework Version 1.1 での Load メソッド |
---|---|
Load(XPathNavigator input);
Load(XPathNavigator input, XmlResolver resolver); |
Load(XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence); |
Load(IXPathNavigable stylesheet);
Load(IXPathNavigable stylesheet, XmlResolver resolver); |
Load(IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence); |
Load(XmlReader stylesheet);
Load(XmlReader stylesheet, XmlResolver resolver); |
Load(XmlReader stylesheet, XmlResolver resolver, Evidence evidence); |
XslTransform.Transform の以前のメソッドと新しいメソッドを次の表に示します。新しいメソッドでは、XmlResolver オブジェクトを受け取ります。
.NET Framework Version 1.0 での Transform メソッド | .NET Framework Version 1.1 での Transform メソッド |
---|---|
XmlReader Transform(XPathNavigator input, XsltArgumentList args) | XmlReader Transform(XPathNavigator input, XsltArgumentList args, XmlResolver resolver) |
XmlReader Transform(IXPathNavigable input, XsltArgumentList args) | XmlReader Transform(IXPathNavigable input, XsltArgumentList args, XmlResolver resolver) |
Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output) | Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) |
Void Transform(IXPathNavigable input, XsltArgumentList args, XmlWriter output) | Void Transform(IXpathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver) |
Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output) | Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver) |
Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output) | Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver) |
Void Transform(XPathNavigator input, XsltArgumentList args, Stream output) | Void Transform(XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver) |
Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output) | Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver) |
Void Transform(String input, String output); | Void Transform(String input, String output, XmlResolver resolver); |
XslTransform.XmlResolver プロパティは、.NET Framework Version 1.1 では使用されなくなりました。その代わりに、XmlResolver オブジェクトを受け取る新しい Transform オーバーロードを使用します。
参照
XslTransform クラスを使用した XSLT 変換 | 変換における XPathNavigator | 変換における XPathNodeIterator | XslTransform への XPathDocument の入力 | XslTransform への XmlDataDocument の入力 | XslTransform への XmlDocument の入力 | XslTransform クラス | XslTransform のメンバ