目次へ

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

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp