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


XML→HTML変換(XSLでXMLをHTMLに整形する)

FMPXMLRESULT文法のXMLデータをHTMLに変換する

 では、FMPXMLRESULT文法のXMLデータを、HTMLへ変換する方法を考えましょう。変換はXSLを使います。まず、検索ページのフォーム中に、XSLで変換することを指定しておきましょう。

XSLで変換することを指定する
<input type="hidden" name="-stylesheet" value="text/xsl">
<input type="hidden" name="-stylehref" value="result.xsl">

 次に、「result.xsl」を書きましょう。

FMPXMLRESULT文法のXMLデータをHTMLに変換する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="FMPXMLRESULT">
		<html>
			<head><title>検索結果</title></head>
			<body>
				<xsl:apply-templates select="RESULTSET" />
			</body>
		</html>
	</xsl:template>

	<xsl:template match="RESULTSET">
		<table border="1">
			<tr><th>name</th><th>os</th><th>price</th><th>color</th></tr>
			<xsl:apply-templates select="ROW" />
		</table>
	</xsl:template>

	<xsl:template match="ROW">
		<tr>
			<xsl:apply-templates select="COL" />
		</tr>
	</xsl:template>

	<xsl:template match="COL">
		<td><xsl:value-of select="DATA" /></td>
	</xsl:template>

</xsl:stylesheet>
1〜4行目:
 おまじない。
6〜13行目:<xsl:template match="FMPXMLRESULT">〜</xsl:template>
 第1階層に対する変換。基本的なHTMLを用意して、検索結果を並べた表を作るために<xsl:apply-templates select="RESULTSET" />つまり、データを作るためのテンプレートを用意した。
15〜20行目:<xsl:template match="RESULTSET">〜</xsl:template>
 RESULTSET要素を処理して、結果表示の表をつくるテンプレートアクション。表を作成する。一般的に、検索結果をしめす表は、1行目がタイトル行で、2行目以降が検索結果です。そこでtable要素を作り、17行目でフィールド名を並べたタイトル行を作っています。検索結果の行は<xsl:apply-templates select="ROW" />で、ROW要素を処理するテンプレートへ処理をまわしている。ROW要素を処理するテンプレートアクションの変換結果がここに埋め込まれて、タイトル行とともにtable要素を構成して、それが10行目に埋め込まれる。
22〜26行目:<xsl:template match="ROW">〜</xsl:template>
 ROW要素を変換するテンプレートアクション。ROW要素はレコードに対応する。具体的には、<tr>〜</tr>タグで行を作っている。<tr>〜</tr>の間には<xsl:apply-templates select="COL" />がある。COL要素に関するテンプレートを適用して、その結果がここに埋め込まれる。
28〜30行目:<xsl:template match="COL">〜</xsl:template>
 COL要素に対するテンプレートアクション。COL要素はフィールドに対応する。COL要素の子要素にはDATA要素があり、フィールドの値はここにある。1つのフィールドに複数の値がある場合(繰返しフィールドなど)は、COL要素に複数のDATA要素が入ってくる。ここでは、<xsl:value-of select="DATA" />によってDATA要素の値を取り出して、<td>〜</td>タグで挟んでいる。

データ行を生成するテンプレートの流れをまとめると、以下のようになる。

  1. 28行目からの<xsl:template match="COL">では、<xsl:value-of select="DATA" />によってDATA要素からフィールドの値を次々と取り出して、td要素でくくっていく。この変換結果は24行目の<xsl:apply-templates select="COL" />にどんどん埋め込まれていく。
  2. その結果、24行目の<xsl:apply-templates select="COL" />の部分は、td要素(フィールドの値)がずらりと並んだ状態に置き換えられる。22行目からの<xsl:template match="ROW">では、これ全体をtr要素でくくって、データ行(1レコード分)を作る。この変換は全てのROW要素に関して繰り返され、変換結果は18行目の<xsl:apply-templates select="ROW" />にどんどん埋め込まれていく。
  3. その結果、18行目の<xsl:apply-templates select="ROW" />は、tr要素(検索該当レコード)がずらりと並んだデータ行のあつまりに置き換えられる。これが、17行目のタイトル行とともにtable要素を構成して、10行目の<xsl:apply-templates select="RESULTSET">へ埋め込まれる。
  4. 最終的に<xsl:template match="FMPXMLRESULT" />には、検索結果の表が完成する。

 このように、XML要素ごとの処理をテンプレートアクション(<xsl:template match="ZZZ">〜</xsl:template>)で記述し、それをテンプレート<xsl:apply-templates select="ZZZ" />を使って適切な場所に埋め込むことで、XMLがHTMLに変換されていきます。>>