目次へ

7.3 スタイルシートのインポート

<xsl:import href = uri-reference /> 

XSLT スタイルシートに、xsl:import 要素を使用して別の XSLT スタイルシートをインポートすることもできます。xsl:import 要素は、href 属性を持ち、その属性値には、インポートするスタイルシートを識別するための URI を指定します。

xsl:import 要素は、トップレベル要素中最初に記述しなければいけません。 xsl:include でスタイルシートをインクルードした場合、インクルードされるドキュメント内の xsl:import 要素はすべて、インクルードする側のドキュメント内にあるすべての xsl:import 要素の後ろに移動されます。

xsl:include 要素と同様に、スタイルシートが自分自身を直接的または間接的にインポートすることはできません。 スタイルシートのインポートは、スタイルシートのインクルードと似ていますが、インクルードのように単純な置き換えを行うのではなく、どのようにインポートされるかによってスタイルシートに含まれる定義とテンプレートルールの優先順位が異なります。

以下のような場合を想定します。

  • スタイルシート A が、スタイルシート B と C をこの順序でインポートする。
  • スタイルシート B がスタイルシート D をインポートする。
  • スタイルシート C がスタイルシート E をインポートする。

この時、下図の左のようなインポートツリーという木構造を構成すると考えます。

image

次に、「兄弟ならば兄が先、親と子では子が先」という規則に従って木をたどります。すると、上図右のような順序となり、インポートの優先順位は、この順序が後であればあるほど高くなります。つまり、上記の例では、最も優先されるのが A、最も優先されないのが D ということになります。

import1.xsl のスタイルシート内
<xsl:import href="import2.xsl" />
<xsl:template match="/people">
  <html lang="ja">
  <head><title>import1</title></head>
  <body>
    <xsl:apply-templates select="person" />
  </body>
  </html>
</xsl:template>
import2.xsl のスタイルシート内
<xsl:template match="/people">
  <html lang="ja">
  <head><title>import2</title></head>
  <body>
    <xsl:apply-templates select="person" />
  </body>
  </html>
</xsl:template>

<xsl:template match="person">
  <p><xsl:value-of select="." /></p>
</xsl:template>

上記のスタイルシートを people.xml に適用すると以下の出力を得られます。

<html lang="ja">
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>import1</title>
</head>
<body>
<p>Kevin Shields</p>
<p>Trent Reznor</p>
</body>
</html>

同一のノードに対するテンプレートがいずれのスタイルシートにも含まれていますが、インポートした側のテンプレートが優先されているのがわかります。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp