Web Artisan Blog - ウェブ アルチザン ブログ

XML:XSLT:再帰によるカウント処理:call-template

XML (18 items)

2005年06月23日

Research Artisan Pro ←リサーチアルチザンがパワーアップして復活しました!!
XSLTでは、基本的に動的なコーディングはできないと言っていい。
つまり、通常の言語なら変数に値を入れる事で容易に出来る処理でも、
XSLTでは変数を変数的に使えない(定数的である)為、
かなり頭を悩ますところである。

しかし、XSLTでは再帰処理を用いる事で、
動的な処理を行う事も出来る。

「自分で自分自身を呼ぶ」というような再帰処理。
ついつい訳がわからなくなって敬遠しがちな人もいるかも知れないが、
これをXSLTでうまく利用すれば、XSLTでできる事の可能性は広がってくる。。
<例>
・XMLデータ(data13.xml)

<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet type="text/xsl" href="data13.xsl"?> 
<test>
  <count>3</count> 
  <count>5</count> 
</test>


このXMLデータのcountノードの値に対して、
templateを使って、値が”1”になるまでマイナスし続ける。


・XMLデータ(data13.xml)を編集するXSLT(data13.xsl)

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns="http://www.w3.org/1999/xhtml" version="1.0">
<xsl:output
 method="html" 
 version="1.0" 
 encoding="Shift_JIS" 
 omit-xml-declaration="yes"
 standalone="yes"
 doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
 doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
 indent="yes" 
 media-type="text/html"/>

<xsl:template match="/">

  <html>
  <head>
  <title>Result</title>
  </head>
  <body>

  <xsl:apply-templates />

  </body>
  </html>

</xsl:template> 

<xsl:template match="test">
  <xsl:apply-templates select="count" />
</xsl:template> 

<xsl:template match="count">
  Value = <xsl:value-of select="." /> <br />
  <xsl:call-template name="countdown">
    <xsl:with-param name="prmcount" select="." />
  </xsl:call-template>

</xsl:template> 

<xsl:template name="countdown">
<xsl:param name="prmcount"/>
  <xsl:choose>
    <xsl:when test="$prmcount = 1"> 
  End :  <xsl:value-of select="$prmcount" /><br /><br />
    </xsl:when>
    <xsl:otherwise>
  Next : <xsl:value-of select="$prmcount" /><br />
      <xsl:call-template name="countdown">
        <xsl:with-param name="prmcount" select="$prmcount - 1" />
      </xsl:call-template>

    </xsl:otherwise>
  </xsl:choose>
</xsl:stylesheet>



</xsl:stylesheet>



call-templateで、値をマイナスするtemplate”countdown”を呼び出す。
”countdown”では、パラメータ”prmcount”の値から1をマイナスする。
更に、パラメータ”prmcount”の値が”1”になるまで、
自分自身(”countdown”)を呼び続ける。


・実行結果のHTML

<html>
<head>
<title>Result</title>
</head>
<body>
Value = 3
Next : 3
Next : 2
End : 1

Value = 5
Next : 5
Next : 4
Next : 3
Next : 2
End : 1

</body>
</html>




■使用例のダウンロード
ダウンロードし、data13.xmlをブラウザで見る事で確認できます。

>>ダウンロード
※XSLTの動くブラウザでお試し下さい。IEであればIE6以上です。
前の記事 次の記事

Comments

とおりすがり wrote:

xsltって手続き型で考えるとOUTですよね。
オブジェクト指向をもっとすすめて宣言的に考えないとうまく組めない。
その辺のブレイクスルーができると、結構楽しい。
2005年08月05日 13時27分41秒

ossi wrote:

XSLTはうまく使う用途があれば威力を発揮するんでしょうね。
多少のことなら使えるんですけど、XSLTだけでどうこうしようとすると、まあ無理なことが多い。
まあ言語じゃないですし、スタイルシートですからね。。

ただ、色々やってて楽しいと感じる事は多いです。
今後も勉強したいと思ってます。
2005年08月06日 23時56分32秒

Add Comments

Trackback

トラックバックはありません

Trackback URL

http://www.res-system.com/weblog/action.php?action=plugin&name=TrackBack&tb_id=493