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

» 2003年10月17日 10時00分 公開
[山田祥寛@IT]

XSLTテンプレートをインクルードする

アイコン

繰り返し使いたいXSLTスタイルシートを別ファイルとして用意しておき、<xsl:include>要素を使用して新規に作成するXSLTスタイルシートに統合する方法を解説します。

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

 XSLTスタイルシートとは、複数のテンプレートから構成される「テンプレート集」であるといえます。単純なものから複雑なものまで、さまざまなテンプレートを作成していくと、一部のテンプレートを再利用したいと思うようになるものです。

 開発生産性という観点からいうならば、再利用可能なテンプレートを別ファイルとして用意しておき、XMLファイルと直接にマッピングするのは、テンプレートを呼び出す「コントローラ」の役割を持ったXSLTスタイルシートであるべきなのです。

 本稿では、XSLT要素の1つである<xsl:include>要素を使用することで、分離されたXSLTスタイルシート(テンプレート)を統合する仕組みを紹介します。

 以下では、別稿「文章の一部分を強調文字で出力する」で紹介したdescription.xslから、強調表示を制御するテンプレート部分を切り出して、include.xslとして外部ファイル化してみることにします。

[description.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>
    <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:include href="https://atmarkit.itmedia.co.jp/ait/articles/0310/17/include.xsl" />
</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>


図 &lt;keywd&gt;要素で囲まれた部分が強調表示される 図 <keywd>要素で囲まれた部分が強調表示される

 スタイルシートのロジックそれ自体に関しては、別稿「文章の一部分を強調文字で出力する」を参照してください。外部ファイル化したスタイルシートの取り込み自体はとても単純で、ただ<xsl:include>要素を取り込み側のスタイルシートに記述するだけです。

<xsl:include href="https://atmarkit.itmedia.co.jp/ait/articles/0310/17/include.xsl" />


 この方法で注意すべきところは、<xsl:include>要素は必ず<xsl:stylesheet>要素の直下に記述する必要がある、という点です。そのほか、XSLTスタイルシートを分割する場合、注意すべき点を以下に挙げておくことにしましょう。

(1)外部ファイルは完結したXSLTスタイルシートであること

 スタイルシートを分割する場合、よくある間違いが<xsl:stylesheet>を記述せず、断片的な(不完全な)XSLTを記述してしまうことです。インクルードという言葉から、そのまま外部ファイルの内容が<xsl:include>要素の位置に埋め込まれると誤解している方も多いようですが、これは「」です。

 外部ファイル化した場合にも、外部ファイルそれ自体は1つの独立したスタイルシートとして完結している必要があるのです。従って、インクルードされる側のファイルにおいても、ルート要素である<xsl:stylesheet>要素は省略することができません。

(2)無限ループを発生させるような呼び出しは記述しない

 今回の例でいうならば、include.xslからdescription.xslを呼び出すような行為です。外部ファイルからさらに別の外部ファイルを呼び出すことは可能ですが、このように自分自身を呼び出した元のスタイルシートを、再度呼び出すような記述はエラーとなります。

 今回のような単純な例である場合には、そうした間違いも起こらないと思われるかもしれませんが、何重にもファイルをインクルードしているようなスタイルシートでは、間接的な無限ループが発生する可能性もあります。例えば、AがBを、BがCを、CがAを呼び出すというようなケースです。なかなか気付きにくいエラーですので、注意してください。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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