ファイルメーカーProのページへ戻る


XSLファイルを強化する〜並べ替えて表示

 XMLデータからXSLを使ってデータを抜きだし、それをレイアウトする方法を勉強しました。ところで、ファイルメーカーPro5から出力される各レコードのデータ(ROW要素)の順番は、データベースを作成したときの入力順になっています。これを、希望の順番に並べ替えてレイアウトする方法を考えましょう。

検索条件にソート条件も付加する方法

 これはCDMLを使ったWeb公開のときとまったく同じです。検索ページのフォームに

CDML的な方法
<input type="hidden" name="-sortfield" value="os">
<input type="hidden" name="-sortorder" value="ascending">

を追加して検索を実行すれば、レコードをOSフィールド対象に降順にした上で、XMLデータが返ってくる・・・・はずなんですが、うまくいったりいかなかったりしてます。特にDescend(またはDescending)を指定した場合に昇順にならないことが多くて悩んでます。うーん、なぜだ。ま、これは目的じゃないのでほっておこう。

XSLでソート方法を指定する方法

 XML+XSLを使ったWebでのデータ配信の醍醐味は、サーバーはデータを出すだけ、レイアウト作業はユーザーのブラウザにやらせるところにあります。少しでもファイルメーカーProにかかる負荷を減らすため、XSLでソート方法を指定して、ソート作業もブラウザにやらせちゃいましょう。

 W3Cで勧告されているのは<xsl:sort>を使う方法ですが、Mac版MSIE5.0はこの構文を解釈できません。代わりに<xsl:apply-templates />にソート方法に関する属性を付け加える方法がマイクロソフト独自仕様として用意されています。独自仕様の是非はともかくとして、今は他に方法はないので、この方法でROW要素の並べ替えを指定してみましょう。「result.xsl」ファイルを次のように書き換えてみましょう。

「result.xsl」の内容
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns:fm="http://www.filemaker.com/fmpdsoresult" xml:lang="ja">
	<xsl:template><xsl:apply-templates/></xsl:template>
	<xsl:template match="text()"><xsl:value-of select="."/></xsl:template>

	<xsl:template match="FMPDSORESULT">
		<html>
			<head><title>検索結果</title></head>
			<body>
				<table border="1">
					<tr><th>商品名</th><th>OS</th><th>価格</th><th>色</th><th>レコードID</th></tr>
					<xsl:apply-templates select="ROW" order-by="+name" />
				</table>
				<ul>
					<li>使用データベース:<xsl:value-of select="DATABASE"/></li>
					<li>使用レイアウト:<xsl:value-of select="LAYOUT"/></li>
				</ul>
			</body>
		</html>
	</xsl:template>

	<xsl:template match="ROW">
		<tr>
			<td><xsl:value-of select="name" /></td>
			<td><xsl:value-of select="os" /></td>
			<td><xsl:value-of select="price" /></td>
			<td><xsl:value-of select="color" /></td>
			<td><xsl:value-of select="@RECORDID" /></td>
		</tr>
	</xsl:template>
							
</xsl:stylesheet>

 たった一カ所、<xsl:apply-templates select="ROW" />にorder-by="+name"を追加するだけです。<xsl:apply-templates select="ROW" />は、ROW要素処理用のテンプレートの適用結果をここに埋め込みなさいという命令ですが、order-by属性によって適用結果の埋め込み順序を指定できます。order-by属性の値は、始めの1文字(+または-)がソート順を示します。+が昇順、-が降順です。続いてソート対象にする要素名を書きます。これで、ROW要素の処理結果は、name要素値の昇順に従って繰り返し埋め込まれていきます。

 このresult.xslを使ってXMLデータをレイアウトすると次のようになります。

 受信したXMLのデータは、今までと同じですが、name要素の値の昇順でROW要素の処理結果が埋め込まれました。ソート作業をブラウザが実行して、レイアウトを行ったのです。

 このデータで、価格つまりprice要素を対象にソートする場合は、ちょっとだけ書き方が変わります。

<xsl:apply-templates select="ROW" order-by="+number(price)" />

 numberを使うことで、price要素を、数値順にソートすることができます。order-by="+price"とすると、文字順序になるので、10のあとに2が出てくるということになってしまいます。>>