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


XSLファイルの説明

 XSLを使うと、XMLデータを様々なレイアウトで表示できることができます。大雑把に言い切ってしまうと、XSLはXMLデータのレイアウトを定義するスタイルシートなのです。では、前項で使用した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="fm:FMPDSORESULT">
		<html>
			<head><title>検索結果</title></head>
			<body>
				<table border="1">
					<tr><th>商品名</th><th>OS</th><th>価格</th><th>色</th></tr>
					<xsl:apply-templates select="fm:ROW" />
				</table>
			</body>
		</html>
	</xsl:template>

	<xsl:template match="fm:ROW">
		<tr>
			<td><xsl:value-of select="fm:name" /></td>
			<td><xsl:value-of select="fm:os" /></td>
			<td><xsl:value-of select="fm:price" /></td>
			<td><xsl:value-of select="fm:color" /></td>
		</tr>
	</xsl:template>
							
</xsl:stylesheet>
1行目:<?xml version="1.0" encoding="Shift_JIS"?>
 『このXSLファイルは、XMLバージョン1.0のデータを取り扱うためのものです。ちなみに、このXSLファイルの文字は、シフトJISコードで保存されています。』という意味です。Unicodeで保存する場合はencoding属性は省略できます。
2行目:<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns:fm="http://www.filemaker.com/fmpdsoresult" xml:lang="ja">
 『このスタイルシートの中でxsl:が接頭語になっている要素は、http://www.w3.org/TR/WD-xslが定義したもので、fm:が接頭語になっている要素は、http://www.filemaker.com/fmpdsoresultが定義したものです。ちなみに、利用するXMLデータの基本言語は日本語です。』という意味です。
3、4行目:
 『XMLデータ中の全てのテキストノードに対して・・・・・』ごめんなさい、作ってる私自身がコイツの意味を理解できずにいます。ファイルメーカーProのサンプルによれば、『次の2つのテンプレートは、XMLプロセッサがデフォルトで提供されていないため追加されました。』だそうです。勉強して、わかったら書きます。とりあえず1〜4行目は呪文だと思って黙って書きましょう。
6〜16行目:<xsl:template match="fm:FMPDSORESULT">〜</xsl:template>
 ここからが、ファイルメーカーProから送られてきたXMLデータを、HTML形式に変換する心臓部です。<xsl:template match="・・・">は、「テンプレート」といって、match属性で指定した要素を対象に変換処理をする部分です。ここではmatch="fm:FMPDSORESULT"つまり、XMLデータの第1階層を指定して、XMLデータ全体を変換操作の対象としています。XMLデータ全体に対して<html>、<head>、<title>といったHTMLタグが追加されていきます。
 ちなみに「fm:」という接頭語はなくても動作します。他のXMLデータにたまたまFMPDSORESULTが使われていて、それらを同時に扱わなければならない場合に、接頭語を付けると区別できます。そんなことはないだろうという前提で、以後はfm:は省略して実験します。
12行目:<xsl:apply-templates select="fm:ROW" />
 『ROW要素に関しては別にテンプレートを用意しているので、それを適用して、結果をここに埋め込む』という構文です。このapply-templatesを書いた部分は、ちょうど表形式の「行」を生成する部分です。ROW要素ごとに行を生成する変換作業を別の場所で繰り返して、その結果をすべてここに埋め込んでいけば、表が完成するという仕掛けです。
 この要素は終了タグが必要ないので、<xsl:apply-templates select="マッチパターン"></apply-templates>と書くところを、<xsl:apply-templates select="マッチパターン" />と、開始タグの最後に「/」を入れる省略表記ができる。
18〜25行目:<xsl:template match="fm:ROW">〜</xsl:template>
 ROW要素に対して適用されるテンプレートです。<tr>〜</tr>を生成しています。ROW要素1つが、テーブルの1行になるようにタグを追加する変換作業が繰り返されます。<tr>〜</tr>の間では、td要素でセルを作っているのがわかります。そのセルの中に入れる情報は、<xsl:value-of select="要素名" />という形式をしています。<xsl:value-of>は要素の値を取り出すために使います。これで、各フィールド要素の値を取り出しています。要素の値を取り出す作業はとてもよく使うので覚えておきましょう。

 <xsl:template match="fm:ROW">テンプレートが全てのROW要素に適用されて次々と行が生成されます。その結果はすべて12行目の<xsl:apply-templates select="fm:ROW" />の部分に埋め込まれていきます。そうすると最終的には、表形式のHTMLが完成するわけです。

xsl:apply-templates select="マッチパターン"
 マッチパターンに該当する処理結果をここに埋め込む。
xsl:template match="マッチパターン"
 マッチパターンに該当する要素の処理(テンプレートアクション)内容を記述する。
xsl:value-of select="マッチパターン"
 マッチパターンに該当する値を取り出す。

 以上で、XML形式のデータが、HTML形式のデータに変換されるのです。>>


 スタイルシートというと、CSS(Cascading Style Sheet)を思い浮かべる方もいると思います。実際、CSSを使ってXMLデータをレイアウトすることもできます。ファイルメーカー社が公開しているXMLの資料に具体的な方法が記載されています。CSSは、色、大きさ、位置などを指定することは得意ですが、ある要素の中から必要なものを抽出したり、ソートしたりする機能は不足しています。XSLは、抽出、ソート、条件分岐、繰返しなどの「処理」が得意なスタイルシート言語です。

 CSSに慣れている人は、場合によってスタイルシート言語を使い分けるのもいいでしょう。例えば、抽出やソートが必要な「検索結果の一覧」画面はXSLで、抽出やソートが必要ない「詳細表示」画面ではCSSでレイアウトするなど。