.NET Framework 2.0におけるXSLTの使い方を理解するはじめにXMLの大きな特長は、データと表現を分離できるという点です。これは特に説明の必要もなく、一般的に言われていることです。しかし、XMLデータとXSLT(XSL Transformations)スタイルシートを組み合わせると、情報を動的に変換し、思いどおりの形式で提示するための強力なツールになります。 また、あるアプリケーションで作成したXMLドキュメントが、そのXMLデータ構造が違うために他のアプリケーションで処理できないという状況はよくあります。既存のXMLデータ構造を処理可能な構造に変換するには、XSLTを使用する必要があります。Microsoftは効果的なXSLT処理用ビルトインサポートの必要性を認識し、高度に最適化された一連のクラスを.NET Framework 2.0に組み込みました。この記事では、XSLT関連クラスを使用してリッチなASP.NET Webアプリケーションを作成する例を紹介しながら、.NET Framework 2.0が提供する豊富なXSLTサポートについて説明します。 概要まず、System.Xml.Xsl名前空間に含まれているXSLT関連のコアクラスを次に示します。
.NET Framework 2.0でXSLTプロセッサとして動作するコアクラス。XMLデータを、HTML、テキスト、他のXMLなど、他の構造に変換するためのクラスです。
不特定数のパラメータと拡張オブジェクトをXSLスタイルシートに渡せるようにします。
XSLスタイルシートでエラーが発生すると、この例外がLoadメソッドによってスローされます。
XSLスタイルシートの処理中に例外が発生するとスローされます。
.NET Framework 2.0では、.NET Framework 1.xのXSLTで使われていたXslTransformクラスはサポートされていません。代わりにlCompiledTransformクラスが使用されています。このXslCompiledTransformでは、パフォーマンスだけでなく、XSLT 1.0仕様に対するサポートも改善されています。.NET Framework 2.0以降では、XSLTはXslCompiledTransformクラスから実行することをお勧めします。XslCompiledTransformクラスの設計はXslTransformクラスと似ているので、既存のコードをXslCompiledTransformクラスに移行することも簡単にできます。 サンプルコードを見る前に、必要となるXslCompiledTransformクラスの重要なメソッドについて簡単に説明します。
このメソッドには複数のオーバーロードがあり、URLを指定する文字列、XmlReaderオブジェクト、XPathNavigatorオブジェクトなどの多様なリソースからXSLスタイルシートをXslCompiledTransformオブジェクトにロードすることができます。
Loadメソッドを使用してロードされたスタイルシートを使って、XMLデータを指定フォーマットに変換します。
実装XSLTクラスとそのメソッドについては簡単に説明しました。ここで、シンプルなXSLTの例を見てみましょう。この記事の目的は、AdventureWorksデータベースからXMLデータの形式でデータを取得し、そのデータをXSLTを使って変換し、ブラウザでHTMLとしてレンダリングすることです。 シンプルなXSLTこの例では、カテゴリデータをXMLストリームとして取得して表示用のHTMLに変換するシンプルなASP.NETページを作成します。ASP.NETページを見る前に、まず「Category.xsl」という名前のXSLファイルを見てみましょう。 <?xml version="1.0" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" /> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Simple XSLT Transformation</TITLE> </HEAD> <BODY> <H2>Simple XSLT Transformation</H2> <table border="1" cellSpacing="1" cellPadding="1"> <center> <xsl:for-each select="//Categories"> <!-- Each record on a seperate row --> <xsl:element name="tr"> <xsl:element name="td"> <xsl:value-of select="ProductSubcategoryID" /> </xsl:element> <xsl:element name="td"> <xsl:value-of select="Name" /> </xsl:element> <xsl:element name="td"> <xsl:attribute name="align">center</xsl:attribute> <xsl:value-of select="ModifiedDate" /> </xsl:element> </xsl:element> </xsl:for-each> </center> </table> </BODY> </HTML> </xsl:template> </xsl:stylesheet> このXSLファイルには、 <%@ Page Language="C#" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Xml" %> <%@ Import Namespace="System.Xml.Xsl" %> <%@ Import Namespace="System.Xml.XPath" %> <%@ Import Namespace="System.Web.Configuration" %> <script runat="server"> void Page_Load(object sender, System.EventArgs e) { string connString = WebConfigurationManager.ConnectionStrings ["adventureWorks"].ConnectionString; using (SqlConnection connection = new SqlConnection(connString)) { connection.Open(); SqlCommand command = new SqlCommand ("Select * from Production.ProductSubcategory as Categories " + " for xml auto,elements", connection); XmlReader reader = command.ExecuteXmlReader(); XPathDocument xpathDoc = new XPathDocument(reader); string xslPath = Server.MapPath("App_Data/Category.xsl"); XslCompiledTransform transform = new XslCompiledTransform(); transform.Load(xslPath); transform.Transform(xpathDoc, null, Response.Output); } } </script> WebフォームのPage_Loadイベントでは、ProductSubcategoryテーブルからXMLの形式でデータを取得し、外部XSLTスタイルシート(Category.xsl)を適用してHTMLを生成します。次に、このHTMLをクライアントブラウザに直接書き込みます。これは、Response.Outputオブジェクトを ブラウザを使用してページに移動すると、次の画面が表示されます。 パラメータをXSLTスタイルシートに渡す パラメータをXSLTスタイルシートに渡す方法は、メソッドや関数に渡す方法と似ています。パラメータをスタイルシートに渡すと、
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:param name="BackGroundColor" select="Blue" />
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>Passing Parameters to an XSLT Style Sheet</TITLE>
</HEAD>
<BODY>
<H2> Passing Parameters to an XSLT Style Sheet</H2>
<table border="1" cellSpacing="1" cellPadding="1">
<center>
<xsl:for-each select="//Categories">
<!-- Each record on a seperate row -->
<xsl:element name="tr">
<xsl:attribute name="bgcolor">
<xsl:value-of select="$BackGroundColor" />
</xsl:attribute>
<xsl:element name="td">
<xsl:value-of select="ProductSubcategoryID" />
</xsl:element>
<xsl:element name="td">
<xsl:value-of select="Name" />
</xsl:element>
<xsl:element name="td">
<xsl:attribute name="align">center</xsl:attribute>
<xsl:value-of select="ModifiedDate" />
</xsl:element>
</xsl:element>
</xsl:for-each>
</center>
</table>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
このコードでは、 <xsl:value-of select="$BackGroundColor" /> この例では、 <%@ Page Language="C#" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Xml" %> <%@ Import Namespace="System.Xml.Xsl" %> <%@ Import Namespace="System.Xml.XPath" %> <%@ Import Namespace="System.Web.Configuration" %> <script runat="server"> void Page_Load(object sender, System.EventArgs e) { string connString = WebConfigurationManager.ConnectionStrings ["adventureWorks"].ConnectionString; using (SqlConnection connection = new SqlConnection(connString)) { connection.Open(); SqlCommand command = new SqlCommand ("Select * from Production.ProductSubCategory as Categories " + " for xml auto,elements", connection); XmlReader reader = command.ExecuteXmlReader(); XPathDocument xpathDoc = new XPathDocument(reader); string xslPath = Server.MapPath("App_Data/Category.xsl"); XslCompiledTransform transform = new XslCompiledTransform(); transform.Load(xslPath); XsltArgumentList argsList = new XsltArgumentList(); string backGroundColor = "Tan"; //Add the required parameters to the XsltArgumentList object argsList.AddParam("BackGroundColor", "", backGroundColor); transform.Transform(xpathDoc, argsList, Response.Output); } } </script> 上記のコードは最初のコード例とよく似ていますが、XsltArgumentListオブジェクトが使用されているという点が異なります。具体的には、XsltArgumentListオブジェクトのインスタンスを作成し、その このように設定して、ブラウザでこのWebページのURLを指定すると、次の画面が表示されます。すべてのカテゴリレコードの背景色が薄茶色になっていることに注目してください。 XSLTスタイルシートから拡張オブジェクトを呼び出す XsltArgumentListクラスでは、パラメータを渡すだけでなく、クラスと名前空間URIを関連付けることで、スタイルシートからクラスのメソッドを直接呼び出すこともできます。スタイルシートからメソッドが呼び出されるオブジェクトのことを拡張オブジェクトと呼びます。この例では、DateTimeConverterという名前の拡張オブジェクトを作成し、 using System; public class DateTimeConverter { public DateTimeConverter() {} public string ToDateTimeFormat(string data, string format) { DateTime date = DateTime.Parse(data); return date.ToString(format); } } 「App_Code」フォルダにDateTimeConverterクラスを置いて、ASP.NETページから簡単に参照できるようにします。XSLTスタイルシートから拡張オブジェクトを呼び出せるようにするには、以下の処理を行います。
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:DateTimeConverter="urn:DateTimeConverter">
<xsl:output method="html" />
<xsl:param name="BackGroundColor" select="Blue" />
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>Invoking extension objects from an XSLT Style Sheet
</TITLE>
</HEAD>
<BODY>
<H2>Invoking extension objects from an XSLT Style Sheet</H2>
<table border="1" cellSpacing="1" cellPadding="1">
<center>
<xsl:for-each select="//Categories">
<!-- Each record on a seperate row -->
<xsl:element name="tr">
<xsl:attribute name="bgcolor">
<xsl:value-of select="$BackGroundColor" />
</xsl:attribute>
<xsl:element name="td">
<xsl:value-of select="ProductSubcategoryID" />
</xsl:element>
<xsl:element name="td">
<xsl:value-of select="Name" />
</xsl:element>
<xsl:element name="td">
<xsl:attribute name="align">center</xsl:attribute>
<xsl:value-of
select="DateTimeConverter:ToDateTimeFormat
(ModifiedDate, 'F')" />
</xsl:element>
</xsl:element>
</xsl:for-each>
</center>
</table>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
ご覧のように、スタイルシートへの修正は最小限に抑えられています。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:DateTimeConverter="urn:DateTimeConverter">
オブジェクトと名前空間URIを関連付けた後は、拡張オブジェクトのメソッドを、それがスタイルシートの一部であるかのように簡単に呼び出すことができます。 次のコード行が、拡張オブジェクトのメソッド呼び出しに当たります。
<xsl:value-of
select="DateTimeConverter:ToDateTimeFormat
(ModifiedDate, 'F')" />
上記の行では、DateTimeConverterクラスの スタイルシートの変更部分を確認したところで、次は、拡張オブジェクトをスタイルシートに渡して拡張オブジェクトのメソッドを呼び出せるようにする部分のコードを見てみましょう。 <%@ Page Language="C#" %> <%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Xml" %> <%@ Import Namespace="System.Xml.Xsl" %> <%@ Import Namespace="System.Xml.XPath" %> <%@ Import Namespace="System.Web.Configuration" %> <script runat="server"> void Page_Load(object sender, System.EventArgs e) { string connString = WebConfigurationManager.ConnectionStrings ["adventureWorks"].ConnectionString; using (SqlConnection connection = new SqlConnection(connString)) { connection.Open(); SqlCommand command = new SqlCommand ("Select * from Production.ProductSubCategory as Categories " + " for xml auto,elements", connection); XmlReader reader = command.ExecuteXmlReader(); XPathDocument xpathDoc = new XPathDocument(reader); string xslPath = Server.MapPath("App_Data/Category.xsl"); XslCompiledTransform transform = new XslCompiledTransform(); transform.Load(xslPath); XsltArgumentList argsList = new XsltArgumentList(); string backGroundColor = "Tan"; //Add the required parameters to the XsltArgumentList object argsList.AddParam("BackGroundColor", "", backGroundColor); //Create and add the extension object to the XsltArgumentList DateTimeConverter converter = new DateTimeConverter(); argsList.AddExtensionObject("urn:DateTimeConverter", converter); transform.Transform(xpathDoc, argsList, Response.Output); } } </script> 重要なコード行を順番に見ていきます。 次のコードでは、BGColorクラスのインスタンスを作成します。
DateTimeConverter converter = new DateTimeConverter();
オブジェクトのインスタンスを作成したら、次はそのインスタンスをXsltArgumentListオブジェクトに追加します。
argsList.AddExtensionObject("urn:DateTimeConverter",converter);
最後に、次のコード行でインスタンスと残りのパラメータをスタイルシートに渡します。 transform.Transform(xpathDoc,argsList,Response.Output); 上記のコードを実行すると、以下の画面が表示されます。 この画面からわかるように、 まとめこの記事では、以下の点について説明しました。
ここで作成したアプリケーションの機能は非常にシンプルですが、これは.NET Framework 2.0でXSLT関連クラスを使用してアプリケーションを作成する方法を理解するための確固たる基盤になるはずです。 著者紹介Thiru Thangarathinam(Thiru Thangarathinam)
オブジェクト指向アプリケーション開発方法論を用いたアプリケーションのアーキテクチャ設計、設計、開発、および実装に関して約6年の経験を持つ。ソフトウェアライフサイクル(設計、開発およびテスト)にも精通。
ASP.NET、.NET Framework、Visual C#.NET、Visual Basic.NET、ADO.NET、XML Webサービス、および.NET Remotingのエキスパートであり、MCAD(.NETトラック)、MCSD、およびMCP資格を保有。 多くの書籍や記事を執筆。メールの宛先はthiruthangarathinam@yahoo.com。 |