XSLT2.0の感覚

Written byがいすと

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>