XslTransform クラスによる XSLT プロセッサの実装
更新 : November 2007
メモ : |
---|
.NET Framework version 2.0 では、XslTransform クラスが廃止されています。XslCompiledTransform クラスを使用して XSLT (Extensible Stylesheet Language for Transformations) 変換を実行できます。詳細については、「XslCompiledTransform クラスの使用」および「XslTransform クラスからの移行」を参照してください。 |
XslTransform クラスは、『XSL Transformations (XSLT) Version 1.0』勧告を実装する 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)
public void Load(string);
Overloads Public Sub Load(String, XmlResolver)
public void Load(string, XmlResolver);
Overloads Public Sub Load(XmlReader, XmlResolver, Evidence)
public void Load(XmlReader, XmlResolver, Evidence);
Overloads Public Sub Load(XPathNavigator, XmlResolver, Evidence)
public void Load(XPathNavigator, XmlResolver, Evidence);
上に示した Load メソッドの大半は、XmlResolver をパラメータとして受け取ります。XmlResolver は、スタイル シートおよび xsl:import 要素と xsl:include 要素で参照されているスタイル シートの読み込みに使用します。
大半の Load メソッドは証拠もパラメータとして受け取ります。証拠パラメータは、スタイル シートに関連付けられている Evidence です。スタイル シートのセキュリティ レベルに応じて、スタイル シートに含まれているスクリプト、スタイル シートで使用されている document() 関数、XsltArgumentList で使用されている拡張オブジェクトなど、そのスタイル シートが参照しているリソースのセキュリティ レベルも変わります。
URL パラメータが含まれた Load メソッドを使用してスタイル シートを読み込んだ場合、証拠が指定されていなければ、指定された URL およびそのサイトとゾーンを組み合わせてスタイル シートの証拠が計算されます。
URI も証拠も指定されていない場合は、スタイル シートに対して設定されている証拠が完全に信頼されます。信頼されていないソースからスタイル シートを読み込んだり、信頼されていない拡張オブジェクトを XsltArgumentList に追加したりしないでください。
セキュリティ レベルと証拠、およびそれがスクリプトに及ぼす影響の詳細については、「<msxsl:script> を使用した XSLT スタイルシートのスクリプト」を参照してください。セキュリティ レベルと証拠、およびそれが拡張オブジェクトに及ぼす影響については、「スタイル シート パラメータと拡張オブジェクト用の XsltArgumentList」を参照してください。
セキュリティ レベルと証拠、およびそれが document() 関数に及ぼす影響については、「外部の XSLT スタイル シートとドキュメントの解決」を参照してください。
スタイル シートに対しては、多くの入力パラメータを指定できます。スタイル シートでは、拡張オブジェクトの関数を呼び出すこともできます。パラメータおよび拡張オブジェクトのいずれも XsltArgumentList クラスを使用してスタイル シートに渡されます。XsltArgumentList の詳細については、「XsltArgumentList メンバ」を参照してください。
XslTransform クラスの安全な使用方法
スタイル シートのセキュリティ特権は、指定されている証拠によって異なります。次の表では、スタイル シートの場所と、指定する証拠の種類を説明します。
シナリオ |
指定する証拠の種類 |
---|---|
XSLT スタイル シートに外部参照がない場合。またはスタイル シートが信頼できるコード ベースにある場合。 |
アセンブリの証拠を指定します。 |
XSLT スタイル シートが外部ソースにある場合。ソースの出所が知られており、検証可能な URI がある。 |
URI を使用して証拠を作成します。 |
XSLT スタイル シートが外部ソースにある場合。ソースの出所は不明。 |
証拠を null に設定します。スクリプト ブロックは処理されません。XSLT document() 関数はサポートされません。特権を持つ拡張オブジェクトは許可されません。 resolver パラメータを null に設定することもできます。そうすれば、xsl:import 要素と xsl:include 要素は処理されません。 |
XSLT スタイル シートが外部ソースにある場合。ソースの出所が不明であるが、スクリプトのサポートが必要。 |
呼び出し元の証拠を要求します。 |
XML データの変換
スタイル シートが読み込まれた後で、いずれかの Transform メソッドを呼び出し、入力ソース ドキュメントを渡すと、変換が開始されます。Transform メソッドは、さまざまな変換出力を提供できるように、オーバーロードされます。変換の結果として得られる出力形式を次に示します。
ファイルの文字列 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)
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 result tree fragment.
Dim testNode As XmlNode = doc.DocumentElement.FirstChild
Dim tmpDoc As New XmlDocument()
tmpDoc.LoadXml(testNode.OuterXml)
' Pass the document containing the result tree fragment
' to the Transform method.
Console.WriteLine(("Passing " + tmpDoc.OuterXml + " to print_root.xsl"))
xslt.Transform(tmpDoc, Nothing, Console.Out, Nothing)
XslTransform xslt = new XslTransform();
xslt.Load("print_root.xsl");
XmlDocument doc = new XmlDocument();
doc.Load("library.xml");
// Create a new document containing just the result tree fragment.
XmlNode testNode = doc.DocumentElement.FirstChild;
XmlDocument tmpDoc = new XmlDocument();
tmpDoc.LoadXml(testNode.OuterXml);
// Pass the document containing the result tree 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 の移行
廃止された .NET Framework バージョン 1.0 の Load メソッドと新しい .NET Framework バージョン 1.1 の Load メソッドを次の表に示します。新しいメソッドでは、証拠を指定することで、スタイル シートのアクセス許可を制限できます。
.NETFramework 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); |
廃止された Transform メソッドと新しい 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); |
.NET Framework バージョン 1.1 では、XslTransform.XmlResolver プロパティが廃止されています。代わりに、XmlResolver オブジェクトを受け取る新しい Transform オーバーロードを使用します。
参照
概念
XslTransform への XPathDocument の入力
XslTransform への XmlDataDocument の入力
XslTransform への XmlDocument の入力