<?xml version="1.0" ?> <xsl:stylesheet version="1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" /> <!--ページングの設定値。 1ページ当たりのレコード数 ページ番号 レコード数 <!-- 1ページ当たりのレコード数 --> <xsl:param name="recordsPerPage" select="77" /> <!-- ページ番号--> <xsl:param name="pageNumber" select="0" /> <!--レコード数 --> <xsl:param name= "recordCount" select="77" /> <xsl:template match="/"> <HTML> <HEAD> <TITLE> XSLT In .NET </TITLE> </HEAD> <BODY> <span align="center" style="color:Blue;background- color:White;font- weight:bold;height:25px; width:634px;Z-INDEX: 102; LEFT: 203px; POSITION: absolute; TOP: 69px"> XSLT Improvements in .NET 2.0 </span> <table style="Z-INDEX: 101; LEFT: 171px; WIDTH: 501px; POSITION: absolute; TOP: 125px; HEIGHT: 322px" border="1" cellSpacing="1" cellPadding="1"> <center> <xsl:for-each select="//Products"> <!--表形式で出力する recordcountパラメータで指定された レコード数しか表示しない --> <xsl:if test="position() > $recordsPerPage * number($pageNumber) and position() <= number($recordsPerPage * number($pageNumber) + $recordsPerPage)"> <!-- 個別の行に関するそれぞれのレコード --> <xsl:element name="tr"> <xsl:element name="td"> <xsl:value-of select="ProductID" /> </xsl:element> <xsl:element name="td"> <xsl:value-of select="ProductName" /> </xsl:element> <xsl:element name="td"> <xsl:attribute name="align">center </xsl:attribute> <xsl:value-of select="SupplierID" /> </xsl:element> <xsl:element name="td"> <xsl:attribute name="align">center </xsl:attribute> <xsl:value-of select="CategoryID" /> </xsl:element> <xsl:element name="td"> <xsl:attribute name="align">center </xsl:attribute> <xsl:value-of select="QuantityPerUnit"/> </xsl:element> </xsl:element> </xsl:if> </xsl:for-each> </center> </table> </BODY> </HTML> </xsl:template> </xsl:stylesheet>
図1■XMLからHTMLへと変換する。この変換例では、Productsテーブルのすべてのレコードを1ページ内に表示する。この時、ページングを実装するためには、スタイルシートに対して「表示すべきレコードセット」「表示すべきページ番号」「レコード総数」(訳注:それぞれリスト2のrecordsPerPage、pageNumber、recordCount)をパラメータとして渡す必要がある。それでは次に、この例を基本にしてスタイルシートにパラメータを与えられるようにしていこう。そのためには、XmlArgumentListクラスを用いる。XmlArgunemtListには、パラメータをスタイルシートに渡す機構が備わっており、再利用そして保守しやすいXSLTを作ることが可能だ。また、XmlArgumentListクラスは、名前空間のURIとクラスとを関連付けることができ、スタイルシートからそのクラスのメソッドを直接呼び出すことをも可能とする。このようにスタイルシートから呼び出されるオブジェクトは、「拡張オブジェクト」と呼ばれる。
XmlArgumentListには、処理を手助ける2つの重要なメソッドが含まれている。1つはAddParameter。これはXmlArgunebtListにパラメータを加えるものだ。もう1つは、AddExtensionObject。これはAddParameterに似ており、XmlArgumentListオブジェクトに新しい拡張オブジェクトを加える。いちどXmlArgumentListオブジェクトに拡張オブジェクトを加え、それをスタイルシートに渡せば、スタイルシートから該当するプロパティやメソッドを直接呼び出せるようになるのだ。
リスト2に示したスタイルシートには、すでに必須パラメータを含めてある。そのため単純に、それらのパラメータに対応する値を引き渡して、標準のパラメータ値を上書きすればよい。
しかしながら、ユーザーが前のページや次のページに移動できるようにするためには、(ページング用の)[Next page]や[Previous page]のリンクを表示するようにスタイルシートを修正する必要がある(リスト3)。そして次に、XsltCommandExample.aspxファイルのPage_Loadイベントをリスト4のように修正する。
<?xml version="1.0" ?> <xsl:stylesheet version="1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform"> …中略(リスト2と同じ)… <table style="Z-INDEX: 101; LEFT: 171px; WIDTH: 501px; POSITION: absolute; TOP: 125px; HEIGHT: 322px" border="1" cellSpacing="1" cellPadding="1"> …中略(リスト2と同じ)… </table> <!-- ここから:前や次のページへのリンクの表示--> <!-- pageNumberが0より大きいときに限って前ページのリンクを表示 --> <span style="Z-INDEX: 101; LEFT: 261px; WIDTH: 501px; POSITION: absolute; TOP: 500px; HEIGHT: 62px"> <xsl:if test="$pageNumber > 0"> <xsl:element name="a"> <xsl:attribute name="href">?pagenumber= <xsl:value-of select="number($pageNumber)-1" /> </xsl:attribute> << Previous Page </xsl:element> </xsl:if> <!-- リストがまだあるなら次のページのリンクを表示 --> <xsl:if test="($recordCount - ((1+number($pageNumber)) * $recordsPerPage))> 0"> <xsl:element name="a"> <xsl:attribute name="href">?pagenumber= <xsl:value-of select="number($pageNumber)+1" /> </xsl:attribute> Next page >> </xsl:element> </xsl:if> <!-- ここまで:前や次のページへのリンクの表示--> </span> </BODY> </HTML> </xsl:template> </xsl:stylesheet>
XsltCommand command = new XsltCommand();
command.Compile(Server.MapPath("ProductsPaging.xsl"));
XmlArgumentList argsList = new XmlArgumentList();
int pageNumber = Convert.ToInt32(
Request.QueryString["pagenumber"]);
argsList.AddParameter
("recordsPerPage", "", 10);
argsList.AddParameter
("pageNumber", "", pageNumber);
argsList.AddParameter("recordCount", "", 77);
command.Execute(xpathDoc, null, argsList, Response.Output);
ここまでの手順を確認してみよう。ブラウザにWebフォームのURLを入力し、結果を見てほしい(図2)。
図2■実行時パラメータによるページングの実装。ページングを実装するためには、スタイルシートに対して適切なパラメータを渡す必要がある。ここでは1ページ当たり10レコードしか表示されていない。なぜならば、recordsPerPageパラメータに10が指定されているからだ(訳注:リスト4ではrecordsPerPageパラメータに10が設定されている)Copyright © ITmedia, Inc. All Rights Reserved.