- 7.1 出力
- 7.2 スタイルシートのインクルード
- 7.3 スタイルシートのインポート
- 7.4 スタイルシートの埋め込み
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 をインポートする。
この時、下図の左のようなインポートツリーという木構造を構成すると考えます。
次に、「兄弟ならば兄が先、親と子では子が先」という規則に従って木をたどります。すると、上図右のような順序となり、インポートの優先順位は、この順序が後であればあるほど高くなります。つまり、上記の例では、最も優先されるのが 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>
同一のノードに対するテンプレートがいずれのスタイルシートにも含まれていますが、インポートした側のテンプレートが優先されているのがわかります。