XSLTテンプレートをインクルードするXMLテクニック集(6)(3/3 ページ)

» 2003年10月17日 10時00分 公開
[山田祥寛@IT]
前のページへ 1|2|3       

XSLTテンプレートの機能を継承する

アイコン

<xsl:import>要素を利用した外部スタイルシートのインポートで、優先順位の低いテンプレートを完全に打ち消すのではなく、現存するテンプレートの機能に追加するテクニックを紹介します。

カテゴリ XSLT
関連要素 <xsl:apply-template>
関連記事 XSLTテンプレートをインポートする

 別稿「XSLTテンプレートをインポートする」では、<xsl:import>要素を利用した外部スタイルシートのインポートについて解説し、<xsl:import>要素によってインポートされた外部ファイルには優先順位がある、と紹介しました。すなわち、<xsl:import>要素を使用した場合、テンプレートは呼び出される側よりも呼び出す側の方が、前に記述された方よりも後に記述された方が、それぞれ優先順位は高くなります。

 しかし、優先順位の低いテンプレートを完全に打ち消すのではなく、現存するテンプレートの機能に「追加」したいというケースがあるでしょう。そのような場合には、<xsl:apply-template>要素を使用することで、元のテンプレートの機能にほかのテンプレートの機能を入れ子で適用することが可能になります。以下のスタイルシートのロジックそれ自体に関しては、別稿「文章の一部分を強調文字で出力する」を参照してください。

[descript.xsl]

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 version="1.0">
  <xsl:import href="https://atmarkit.itmedia.co.jp/ait/articles/0310/17/include.xsl" />
  <xsl:template match="/">
    <html>
    <head>
    <title><xsl:value-of select="books/@name" /></title>
    </head>
    <body >
    <h1><xsl:value-of select="books/@name" /></h1>
    <dl>
    <xsl:for-each select="books/book">
      <xsl:sort select="published" data-type="text"
                order="descending" />
      <xsl:sort select="price" data-type="text"
                order="ascending" />
      <dt><h3><xsl:value-of select="title" />
        (<xsl:value-of select="author" />,
          <xsl:value-of select="published" />,
          <xsl:value-of select="price" />)</h3></dt>
      <dd>
        <xsl:apply-templates select="description" />
      </dd>
      <p><hr /></p>
    </xsl:for-each>
    </dl>
    </body>
    </html>
  </xsl:template>
  <xsl:template match="description">
    <i><xsl:apply-imports /></i>
  </xsl:template>

</xsl:stylesheet>

[include.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="keywd">
    <span style="font-weight:bold;">
      <xsl:value-of select="." />
    </span>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:value-of select="." />
  </xsl:template>
</xsl:stylesheet>


 別稿「XSLTテンプレートをインポートする」のdescript.xslと比較してください。違いは、descript.xslにおいて、<xsl:template match="description">要素が記述されているかどうかです。<xsl:template match="description">要素が記述されていない場合には、単純にinclude.xslで定義された<xsl:template match="keywd">、<xsl:template match="text()">が適用され、<keywd>要素の内容がボールド体で表示されます。

 しかし、例えば、descript.xslの内部に以下のように<xsl:value-of select="." />と記述された場合にはどうでしょう。

<xsl:template match="description">
  <i><xsl:value-of select="." /></i>
</xsl:template>


 この場合、<xsl:import>要素のルールに従い、呼び出し側のスタイルシートが優先され、include.xslの内容は無視されてしまうのです。つまり、<description>要素の内容はただ単にイタリック体で表示されるだけです。

 では、<description>要素の内容をイタリック体で表示し、かつ<keywd>要素の内容をボールド体で表示するにはどのようにしたらよいのでしょう。それが本稿で紹介する<xsl:apply-imports>要素の役割なのです。

<xsl:template match="description">
  <i><xsl:apply-imports /></i>
</xsl:template>


 これによって、優先順位のルールからすれば「本来であれば実行されないはず」の、include.xslの内容が適用され、<keywd>要素がボールド体に修飾された<description>要素の内容が、さらにイタリック体に修飾されて表示されるというわけです。

図 &lt;description&gt;要素の中身を斜体で、かつ&lt;keywd&gt;要素の部分を強調表示 図 <description>要素の中身を斜体で、かつ<keywd>要素の部分を強調表示

 <xsl:apply-imports>要素によって、単にテンプレートを置き換えるわけではなく、テンプレートの機能を積み上げ式に追加することが可能になります。より柔軟にスタイルシートを記述する場合に有用なテクニックですので、しっかりとおさえておいてください。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。