7 XPathによる様々な表記
7.1 カッコ書きによる集合の表現
XSLT1.0でやりづらかった処理に「任意回数の繰り返し」すなわちfor文があります。これを実装するには、再帰を使って以下のような形で書く必要がありました:
<xsl:template name="ForMain">
<fortest>
<xsl:call-template name="Loop">
<xsl:with-param name="start" select="1"/>
<xsl:with-param name="end" select="5"/>
</xsl:call-template>
</fortest>
</xsl:template>
<xsl:template name="Loop">
<xsl:param name="start"/>
<xsl:param name="end"/>
<result time="{$start}">
<xsl:text>Do something</xsl:text>
</result>
<xsl:if test="$start!=$end">
<xsl:call-template name="Loop">
<xsl:with-param name="start" select="$start+1"/>
<xsl:with-param name="end" select="$end"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
【出力】
<fortest>
<result time="1">Do something</result>
<result time="2">Do something</result>
<result time="3">Do something</result>
<result time="4">Do something</result>
<result time="5">Do something</result>
</fortest>
ただある回数処理するだけなら、回数を表す変数を渡して、デクリメントして0と比較すれば変数は1つですみますが、この例は1~5を出力する処理も意図しているのでそのようにしてあります。
XPath2.0では、(1,2,4)や(1 to 3)といったように、カッコを使うことで変数の集合を扱うことができます。XSLT2.0では、任意の回数の繰り返しを、XPath2.0で代入したこの変数集合に対してxsl:for-eachを作用させれば簡単に実装できます。
<xsl:template name="ForMain2">
<fortest>
<xsl:for-each select="(1 to 5)">
<result time="{.}">
<xsl:text>Do something</xsl:text>
</result>
</xsl:for-each>
</fortest>
</xsl:template>
|