プログラミング基礎 II

第十二回 (2010年 1月14日)

名前付きテンプレート

http://www.sw.it.aoyama.ac.jp/2009/PB2/lecture12.html

Martin J. Dürst

duerst@it.aoyama.ac.jp

AGU

© 2007-10 Martin J. Dürst 青山学院大学

今日の予定

定期試験の予定

1 月18日 (月曜日) 3時限に最後の授業

1 月 25日 (月曜日) 3時限 (13:10-14:10)

過去の問題:

前々回の演習

本ごとの郵送料を計算する。注文のリストにそのための新しい欄を作る。本の全体の値段に足す。(詳細略)

ヒント (Test-Driven Development):

正解例: ordersShipping.xsl, その出力: ordersShipping.html

前回の復習

前回の演習

演習 1

本をテーブルとして出力する変換ファイルを次のように変更する:

正解例: tableStripes.xsl, その出力: resultStripes.html

演習 2

正解例: tableClump.xsl (出力は <xsl:apply-templates> を使ったものと変わらない)

順番の問題

問題:<xsl:template match='book[(position() mod 3) = 0]'> で分岐しようとすると、ソートがうまくできない

実例: tableStripesTemplate.xsl, その出力: tableStripesTemplate.html

理由:

解決:

名前付きテンプレートの目的

名前付きテンプレートの基本形

<xsl:template name='greeting'>
  <p>Hello <strong>dear customer</strong>!</p>
</xsl:template>

名前付きテンプレートの呼び方

<xsl:template ...>
  ...
  <xsl:call-template name='greeting'/>
  ...
</xsl:template>

引数

parameter (ひきすう)

引数の例

<xsl:template name='greeting'>
  <xsl:param name='who' select='"customer"'/>
  <p>Hello <strong>dear <xsl:value-of select='$who'/></strong>!</p>
</xsl:template>
 ...
<xsl:call-template name='greeting'>
  <xsl:with-param name='who'>青山 例子</xsl:with-param>
</xsl:call-template>

応用例: 階乗

階乗を計算するテンプレート

<xsl:template name='階乗'>
  <xsl:param name='n'/>
  <xsl:choose>
    <xsl:when test='$n = 1'>1</xsl:when>
    <xsl:otherwise>
      <xsl:variable name='n1'>
        <xsl:call-template name='階乗'>
          <xsl:with-param name='n' select='$n - 1'/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select='$n * $n1'/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

再帰

<xsl:param> のもう一つの使い方

演習 1

  1. 応用例 (階乗) を使った変換ファイルを作成し、何かの数字の階乗を計算してください

    ヒント:

  2. 1. の変更で n を変換ファイルの外から指定できるようにする

正解例: fac.xsl

演習 2

提出: 1月17日 (曜日) 22:00 までに Moodle に投稿

(例えば新年とか成人式の) 挨拶文を (X)HTML で出力する変換ファイルを作る。

相手の名前と挨拶文の回数は外側から指定できるようにする。

ヒント: 「n 回の挨拶文」を階乗と同じように定義しなおす。

次回への準備

授業全体の内容を復習し、分からない部分をリストアップ