Dreamweaver TechniqueJAVA Script サンプル | CSS sample | JAVA Applet sample | Flash Sample
HTML4.0 riference | DynamicHTMLXHTML | XML sample | XSLT sample | RIKO's ASP Trial

テンプレートルールをユニット化する

■ テンプレート呼び出し

このサンプルは、テンプレートルールに名前をつけてユニットのように扱い、名前を目印に呼び出して使うものです。DTPソフトにある、スタイル設定とスタイル適用の機能に似ています。まず、<xsl:template name="テンプレートの名前">テンプレートルール</xsl:template> のように記述し、テンプレートルールに名前を付けてユニットにします。次に<xsl:call-template nam="呼び出すテンプレートの名前"> </xsl:template>のように記述し、テンプレートルールを呼び出します。XMLのWebページの中で同じテンプレートルールを複数回使いたい場合、この機能を使えばXSL 同じコードを記述する必要がありません。

call-tempate.xml

 

call-template.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>call-template</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:stylesheet>

@ 2番目の<div>ブロック内に「テンプレート2」という名前のテンプレートルールを呼び出しています。

A 「テンプレート2」という名前のテンプレートルールを呈して言います。このルールが@で指定した2番目の<div>ブロック内で適用されるようになります。

Microsoft XSLを使ってxsl:template要素でテンプレートルールを定義し、xsl:apply-templates要素で適用させるコードを書きなれている人は、従来のコードと見比べると違いが分かりやすいでしょう。

<?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:apply-templates select="全体" />
   </div>
</body>
</html>
</xsl:template>

<xsl:template match="全体">
   <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:stylesheet>

■ 注意

※ テンプレートを特定しなければならないので、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>

 

<<<戻る

R HOUSE | RIKO's Trial Page | Shirley's Pettit Case | Shirley's i-box | Shirley's little box