パラメータの応用(再帰処理)

再起処理の応用。株式銘柄数だけループし、その出来高合計を計算する。

[サンプルXML文書を表示](下のフレームに)

XMLソース

<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet type="text/xsl" href="param03.xsl"?>
<root>
<title>2003年11月05日の東証株式第一部情報</title>
<info><name>銘柄</name><end>終値(円)</end><total>出来高(千株)</total></info>
<data>
<kabu><name code="6752">松下</name><end>1529</end><total>12302</total></kabu>
<kabu><name code="6753">シャープ</name><end>1786</end><total>3964</total></kabu>
<kabu><name code="6758">ソニー</name><end>4030</end><total>8220</total></kabu>
<kabu><name code="6764">三洋</name><end>516</end><total>7551</total></kabu>
<kabu><name code="6501">日立</name><end>692</end><total>21896</total></kabu>
<kabu><name code="6502">東芝</name><end>440</end><total>17832</total></kabu>
<kabu><name code="6701">NEC</name><end>1027</end><total>19229</total></kabu>
<kabu><name code="6702">富士通</name><end>708</end><total>16634</total></kabu> </data>
<end>以上です(2004/5/20)</end>
</root>

XSLソース

<?xml version="1.0" encoding="Shift_Jis"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="Shift_JIS"/>
<xsl:template match="/">
<center><p><xsl:value-of select="root/title"/>の<br/>
<b>出来高データ</b></p></center>
<xsl:apply-templates select="root/data"/>
</xsl:template>
<xsl:template match="data">
<xsl:call-template name="Test"/>
</xsl:template>
<xsl:template name="Test">
<xsl:param name="LastNum" select="count(kabu)"/><!--終了条件の数値、<kabu>要素の個数-->
<xsl:param name="CountNum" select="1"/> <!--繰り返しを数えるカウンタ数値-->
<xsl:param name="TotalNum" select="number(kabu[1]/total)"/><!--出来高合計の数値-->
<xsl:value-of select="$CountNum"/>: <!--カウンタ数値を表示-->
<xsl:value-of select="kabu[$CountNum]/name"/>:<!--銘柄名を表示-->
<xsl:value-of select="kabu[$CountNum]/total"/>(千株)<br/><!--出来高を表示-->
<!--(終了条件)カウンタ数値が<kabu>要素数より小さい場合だけ、
自分自身である名前付きテンプレートを繰り返し呼び出す。-->

<xsl:if test="$CountNum &lt; $LastNum">
<xsl:call-template name="Test">

<xsl:with-param name="CountNum" select="$CountNum+1"/><!--カウンタ数値を1増やす-->
<xsl:with-param name="TotalNum"
select="number($TotalNum)+number(kabu[$CountNum+1]/total)"/><!--出来高を合計-->
</xsl:call-template>
</xsl:if>
<!--繰り返し処理が終了したら、出来高の総合計を表示-->
<xsl:if test="$CountNum &gt;= $LastNum">
<hr/>■出来高の総合計は:<xsl:value-of select="$TotalNum"/>(千株)
</xsl:if>
</xsl:template>
</xsl:stylesheet>

end(04/5/20)