.NET Framework 2.0で改善されたXSLTVisual Studio Magazine(3/5 ページ)

» 2005年01月24日 11時30分 公開
[Thiru Thangarathinam,FTPOnline]
リスト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>

図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のように修正する。

リスト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)。

図2■実行時パラメータによるページングの実装。ページングを実装するためには、スタイルシートに対して適切なパラメータを渡す必要がある。ここでは1ページ当たり10レコードしか表示されていない。なぜならば、recordsPerPageパラメータに10が指定されているからだ(訳注:リスト4ではrecordsPerPageパラメータに10が設定されている)

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ