リスト2■商品情報を表示する(XSL)。XMLからHTMLへと変換するには、このXSLスタイルシートを用いる。XSLファイルでは、すべての商品をループ処理してそれをHTMLへと変換するため、xsl:for-each要素を用いる |
<?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> |
それでは次に、この例を基本にしてスタイルシートにパラメータを与えられるようにしていこう。そのためには、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のように修正する。
リスト3■次や前のページにたどるためのリンクを加える(XSL)。XSLページに[Next page]や[Previous Page]のリンクを加えるのは単純だ。最終的には、スタイルシートの上部で定義されたパラメータ値(訳注:リスト2のrecordsPerPage、pageNumber、recordCount)は、Webフォームから動的に引き渡される。このコードでは、呼び出し元がスタイルシートに対してこれらの値を渡してこなかった時に採用される標準値を割り当てている点に注意してほしい |
<?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> |
リスト4■パラメータをスタイルシートに引き渡す(C#)。パラメータをスタイルシートに引き渡すのは簡単だ。パラメータを加えるには、単純にXmlArgumentListオブジェクトのAddParameterメソッドを用いる。XmlArgumentListオブジェクトは、XmlCommandオブジェクトの引数として引き渡す |
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)。
Copyright © ITmedia, Inc. All Rights Reserved.