- 5.1 変数とパラメータ
- 5.2 xsl:copy-of を用いた変数とパラメータの使用
- 5.3 変数とパラメータの宣言箇所による違い
- 5.4 テンプレートへのパラメータの引き渡し
5.2 xsl:copy-of を用いた変数とパラメータの使用
<xsl:copy-of select = expression />
xsl:copy-of 要素を使用すると、結果ツリーフラグメントを結果ツリーに挿入できます。select 属性は必須であり、式を記述することで属性値を指定します。式の評価結果が結果ツリーフラグメントであれば、フラグメント全体を結果ツリー内にコピーします。結果がノード集合であれば、ノード集合内の全ノードをドキュメント順に結果ツリー内にコピーします。要素ノードをコピーすると、要素ノード自体とともに属性ノード、名前空間ノード、要素ノードの子もコピーされます。この点で xsl:copy と異なります。結果がノード集合または結果ツリーフラグメントのいずれでもない場合には、xsl:value-of を使用する場合と同様に、その結果を文字列に変換してから結果ツリーに挿入します。
<xsl:variable name="other_people"> <xsl:element name="people"> <xsl:element name="person"> <xsl:attribute name="name">Kurt Cobain</xsl:attribute> </xsl:element> <xsl:element name="person"> <xsl:attribute name="name">Richard Ashcroft</xsl:attribute> </xsl:element> </xsl:element> </xsl:variable> <xsl:template match="/"> <xsl:copy-of select="$other_people"/> </xsl:template>
上記のテンプレートを people.xml に適用すると以下の出力を得られます。
<people><person name="Kurt Cobain"/><person name="Richard Ashcroft"/></people>
5.3 変数とパラメータの宣言箇所による違い
xsl:variable および xsl:param の両者とも、トップレベルの要素として使用でき、使用する位置について特に制限はありません。
また、xsl:variable と xsl:param は、どちらもトップレベルだけでなく、テンプレート内でも使用できます。 xsl:variable は、テンプレート内部であれば、その位置に関わらず使用できますが、xsl:param は、xsl:template 要素の先頭に子として記述しなければいけません。テンプレート内において xsl:variable と xsl:param で宣言した変数およびパラメータは、それに続くすべての兄弟と子孫からのみ参照できます。
<xsl:template match="/"> <xsl:variable name="y" select="$x+2"/> <xsl:variable name="x" select="3"/> </xsl:template>
上記の例は、変数 y が変数 x を参照していますが、変数 x が参照できる位置で変数 y を宣言していないためエラーとなります。
同じ名前を持つ他の変数およびパラメータを参照できる位置に新たに現れた宣言は、以前の宣言を上書きします。つまり、より後に行なわれた宣言が有効となります。ただし、あるテンプレート内で宣言されたものに対し、同一テンプレート内でこのような上書きを行うことはできません。したがって以下の例はエラーとなります。
<xsl:template name="foo"> <xsl:param name="x" select="1"/> <xsl:variable name="x" select="2"/> </xsl:template>
ただし、以下の例はエラーとはなりません。
<xsl:param name="x" select="1"/> <xsl:template name="foo"> <xsl:variable name="x" select="2"/> </xsl:template>
5.4 テンプレートへのパラメータの引き渡し
<xsl:with-param name = qname select = expression> <!-- Content: template --> </xsl:with-param>
xsl:with-param 要素を用いることによりパラメータをテンプレートに渡すことができます。name 属性は必須であり 、テンプレート内で宣言しているデフォルト値を上書きしたいパラメータ名を指定します。xsl:with-param は、xsl:call-template および xsl:apply-templates のいずれかの内部で使用します。select 属性の指定方法は xsl:param 要素と同様です。
また、パラメータ x を受け取る xsl:param 要素を持たないテンプレートにパラメータ x を渡してもエラーにはならず、単に無視されます。
<xsl:template match="/"> <xsl:apply-templates select="people"> <xsl:with-param name="other_person" select="people/person[1]" /> </xsl:apply-templates> </xsl:template> <xsl:template match="people"> <xsl:param name="other_person">Bobby Gillespie</xsl:param> <xsl:value-of select="$other_person"/> </xsl:template>
上記のテンプレートを people.xml に適用すると以下の出力を得られます。
Kevin Shields