テンプレートルールをユニット化する
このサンプルは、テンプレートルールに名前をつけてユニットのように扱い、名前を目印に呼び出して使うものです。DTPソフトにある、スタイル設定とスタイル適用の機能に似ています。まず、<xsl:template name="テンプレートの名前">テンプレートルール</xsl:template> のように記述し、テンプレートルールに名前を付けてユニットにします。次に<xsl:call-template nam="呼び出すテンプレートの名前"> </xsl:template>のように記述し、テンプレートルールを呼び出します。XMLのWebページの中で同じテンプレートルールを複数回使いたい場合、この機能を使えばXSL 同じコードを記述する必要がありません。
call-tempate.xml
call-template.xsl
@ 2番目の<div>ブロック内に「テンプレート2」という名前のテンプレートルールを呼び出しています。
A 「テンプレート2」という名前のテンプレートルールを呈して言います。このルールが@で指定した2番目の<div>ブロック内で適用されるようになります。
Microsoft XSLを使ってxsl:template要素でテンプレートルールを定義し、xsl:apply-templates要素で適用させるコードを書きなれている人は、従来のコードと見比べると違いが分かりやすいでしょう。
※ テンプレートを特定しなければならないので、name属性は必須です。同じ名前のテンプレートが複数あると特定できずにエラーとなります。
※ プロセッサがXSLコード走査の仮定で<xsl:apply-imports />を記述した位置をカレントノードとして読み込まれたテンプレートを処理するので、読み込むテンプレートルールのカレントノードが性格に特定できなければエラーになります。
call-template_error.xml <?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="call-template_error.xsl"?>
<全体>
<タイトル>call-templateサンプルerror</タイトル>
<情報>
<氏名>愛媛花子</氏名>
<ハンドル>hanako</ハンドル>
<住所>松山市道後1-1-1</住所>
<勤務先>道後IT株式会社</勤務先>
</情報>
<情報>
<氏名>夏目団吾</氏名>
<ハンドル>dango</ハンドル>
<住所>松山市湯渡2-2-2</住所>
<勤務先>松山XMLセンター</勤務先>
</情報>
<情報>
<氏名>九里杏子</氏名>
<ハンドル>あんこ</ハンドル>
<住所>松山市文京町3-3-3</住所>
<勤務先>伊予XSL株式会社</勤務先>
</情報>
</全体>
call-template_error.xsl <?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html lang="ja">
<head>
<title>住所録</title>
<style type="text/css">
table{width:400px;}
th{width:80px;background:silver;color:black;}
td{background:gainsboro;}
</style>
</head>
<body>
<div>
<h1><xsl:value-of select="全体/タイトル" /></h1>
</div>
<div>
<xsl:call-template name="テンプレート2" />
</div>
</body>
</html>
</xsl:template><xsl:template name="テンプレート2">
<xsl:for-each select="全体/情報">
<table>
<tr><th>氏名</th><td><xsl:value-of select="氏名" /></td></tr>
<tr><th>ハンドル</th><td><xsl:value-of select="ハンドル" /></td></tr>
<tr><th>住所</th><td><xsl:value-of select="住所" /></td></tr>
<tr><th>勤務先</th><td><xsl:value-of select="勤務先" /></td></tr>
</table>
</xsl:for-each>
</xsl:template><xsl:template name="テンプレート2">
<xsl:for-each select="全体/情報">
<table>
<tr><th style="color:navy;">氏名</th><td><xsl:value-of select="氏名" /></td></tr>
<tr><th style="color:navy;">ハンドル</th><td><xsl:value-of select="ハンドル" /></td></tr>
<tr><th>住所</th><td><xsl:value-of select="住所" /></td></tr>
<tr><th>勤務先</th><td><xsl:value-of select="勤務先" /></td></tr>
</table>
</xsl:for-each>
</xsl:template></xsl:stylesheet>
<<<戻る