リスト6■拡張オブジェクトを加える(C#)。ReturnBGColorメソッドを利用するコードは素直だ。BGColorクラスのインスタンスを作り、AddExtentionObjectを使ってそのインスタンス化したオブジェクトをXmlArgumentListオブジェクトに加える |
XsltCommand command = new XsltCommand(); // XSLスタイルシートをコンパイルする command.Compile(Server.MapPath ("ProductsPaging.xsl")); XmlArgumentList argsList = new XmlArgumentList(); // (訳注WebのURLパラメータとして渡された)クエリ文字列から // pageNumberを取得する int pageNumber = Convert.ToInt32( Request.QueryString["pagenumber"]); // 必須パラメータをXmlArgumentListオブジェクトに加える XmlArgumentList object argsList.AddParameter ("recordsPerPage", "", 10); argsList.AddParameter ("pageNumber", "", pageNumber); argsList.AddParameter ("recordCount", "", 77); // インスタンスを作り、XsltArgumentListオブジェクトに加える BGColor obj = new BGColor(); argsList.AddExtensionObject ("urn:myColor",obj); command.Execute(xpathDoc, null, argsList, Response.Output); |
リスト6の例では、スタイルシートからカスタムコードを実行するために拡張オブジェクトを用いた。しかしスタイルシートの内部にスクリプトとして埋め込むことでも、同様の機能を実現できる(リスト7)。
リスト7■スタイルシートにスクリプトを埋め込む(XSL)。スクリプトのメソッド(ReturnBGColor)を呼び出すコードは変わらない。Webフォームにおいては、XsltCommandExample.aspxファイルをコピーし、それをXsltCommandExampleWithScript.aspxという名前に変更してほしい。そしてPageのLoadイベントにある、BGColorオブジェクトを作ってXmlArgumentListオブジェクトに加えているコード部分を削除する。ブラウザからページを参照すれば、リスト6と同じ出力を得られる |
<?xml version="1.0" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:myColor="urn:myColor"> <msxsl:script language="C#" implements-prefix="myColor"> <![CDATA[ public string ReturnBGColor(int categoryID) { string bgColor = null; switch (categoryID) { case (1): bgColor = "#FFFFC0"; break; …略(リスト5と同)… } return (bgColor); } ]]> </msxsl:script> <xsl:output method="html" /> …略(リスト3と同)… <!-- 個別の行に関するそれぞれのレコード --> <xsl:element name="tr"> <xsl:attribute name="bgcolor"> <xsl:value-of select= "myColor:ReturnBGColor(CategoryID)" /> </xsl:attribute> <xsl:element name="td"> <xsl:value-of select="ProductID" /> </xsl:element> …略(リスト3と同)… </xsl:stylesheet> |
ここまで述べてきた例は、単におもしろいといっただけではなく、このテクノロジーを利用して何ができるのかをほのめかすものでもある。
たとえば、毎回Productsテーブルからすべての行を取得するのではなく、要求された行数だけを取得するように、ここで述べた例を拡張することもできるだろう。拡張オブジェクトは、ユーザーインタフェースの単純なカスタマイズに限らず、さらに、テーブル検索、データ値の調査(バリデーション)、バックアップ操作といった複雑な操作のためにも使える。
著者について:
Thiru Thangarathinam氏は、アリゾナ州チャンドラのインテル社で働いている。.NET関連テクノロジを使った分散エンタープライズアプリケーションの構築、設計、開発を専門とする。.NET関連テクノロジに関する多くの共著書を執筆しており、オンライン出版物にもたびたび寄稿している。
日本語訳:大澤文孝
Copyright © ITmedia, Inc. All Rights Reserved.