XSLTテンプレートの機能を継承する
<xsl:import>要素を利用した外部スタイルシートのインポートで、優先順位の低いテンプレートを完全に打ち消すのではなく、現存するテンプレートの機能に追加するテクニックを紹介します。
カテゴリ | XSLT | |
関連要素 | <xsl:apply-template> | |
関連記事 | XSLTテンプレートをインポートする |
別稿「XSLTテンプレートをインポートする」では、<xsl:import>要素を利用した外部スタイルシートのインポートについて解説し、<xsl:import>要素によってインポートされた外部ファイルには優先順位がある、と紹介しました。すなわち、<xsl:import>要素を使用した場合、テンプレートは呼び出される側よりも呼び出す側の方が、前に記述された方よりも後に記述された方が、それぞれ優先順位は高くなります。
しかし、優先順位の低いテンプレートを完全に打ち消すのではなく、現存するテンプレートの機能に「追加」したいというケースがあるでしょう。そのような場合には、<xsl:apply-template>要素を使用することで、元のテンプレートの機能にほかのテンプレートの機能を入れ子で適用することが可能になります。以下のスタイルシートのロジックそれ自体に関しては、別稿「文章の一部分を強調文字で出力する」を参照してください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
別稿「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="." />と記述された場合にはどうでしょう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
この場合、<xsl:import>要素のルールに従い、呼び出し側のスタイルシートが優先され、include.xslの内容は無視されてしまうのです。つまり、<description>要素の内容はただ単にイタリック体で表示されるだけです。
では、<description>要素の内容をイタリック体で表示し、かつ<keywd>要素の内容をボールド体で表示するにはどのようにしたらよいのでしょう。それが本稿で紹介する<xsl:apply-imports>要素の役割なのです。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
これによって、優先順位のルールからすれば「本来であれば実行されないはず」の、include.xslの内容が適用され、<keywd>要素がボールド体に修飾された<description>要素の内容が、さらにイタリック体に修飾されて表示されるというわけです。
<xsl:apply-imports>要素によって、単にテンプレートを置き換えるわけではなく、テンプレートの機能を積み上げ式に追加することが可能になります。より柔軟にスタイルシートを記述する場合に有用なテクニックですので、しっかりとおさえておいてください。
Copyright © ITmedia, Inc. All Rights Reserved.