XSLTスタイルシートから拡張オブジェクトを呼び出す
XsltArgumentListクラスでは、パラメータを渡すだけでなく、クラスと名前空間URIを関連付けることで、スタイルシートからクラスのメソッドを直接呼び出すこともできます。スタイルシートからメソッドが呼び出されるオブジェクトのことを拡張オブジェクトと呼びます。この例では、DateTimeConverterという名前の拡張オブジェクトを作成し、ModifiedDate値を適切な形式に書式設定します。この目的のために、ToDateTimeFormat()というメソッドのみを持つDateTimeConverterクラスを作成します。ToDateTimeFormat()は、指定された書式文字列に従って入力データの書式を設定するメソッドです。
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スタイルシートから拡張オブジェクトを呼び出せるようにするには、以下の処理を行います。
- 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要素には、xmlns:DateTimeConverter="urn:DateTimeConverter"属性が追加されています。これは、拡張オブジェクトの名前空間URIを関連付けるために必要です。この関連付けは、次のコード行で行われます。
<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クラスのToDateTimeFormat()メソッドを呼び出して、ModifiedDateと必要な日付書式文字列を渡しています。
スタイルシートの変更部分を確認したところで、次は、拡張オブジェクトをスタイルシートに渡して拡張オブジェクトのメソッドを呼び出せるようにする部分のコードを見てみましょう。
<%@ 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);
上記のコードを実行すると、以下の画面が表示されます。
この画面からわかるように、ModifiedDate値は適切に書式設定されています。
まとめ
この記事では、以下の点について説明しました。
- XSLTスタイルシートを使用してXML文書を変換する方法。
- XsltArgumentListクラスを使用してパラメータをXSLTスタイルシートに指定する方法。
- XSLTスタイルシートから拡張オブジェクトのメソッドを呼び出す方法。
- XPath式を使用して一連のノードをフィルタリングする方法。
ここで作成したアプリケーションの機能は非常にシンプルですが、これは.NET Framework 2.0でXSLT関連クラスを使用してアプリケーションを作成する方法を理解するための確固たる基盤になるはずです。

