http://www.sw.it.aoyama.ac.jp/2007/PB2/lecture11.html
O 棟 529号室
© 2006-8 Martin J. Dürst 青山学院大学
<xsl:for-each>
<xsl:attribute>
など<xsl:if>
<xsl:choose>
提出: 12月23日 (日曜日) 22:00 までに Moodle に投稿
order.xml の注文を HTML で分かりやすいように変更する。注文票に本の題名、著者、値段などをbooks.xml から引用し、本ごとの小計 (冊の数 * 単価) を計算し、表で出力する。
条件: 同じ処理を繰り返さないように、そして XSLT が読みやすいように、変数を一つだけではなく三つぐらい使ってください。
ヒント: 途中までの変換ファイル: myorders.xsl
正解の例: orders.xsl
提出: 12月30日 (日曜日) 22:00 までに Moodle に投稿
本ごとの郵送料を計算する。注文のリストにそのための新しい欄を作る。本の全体の値段に足す。
本の数 | ||||
---|---|---|---|---|
> 50 | > 2 | ≤ 2 | ||
値段 (円) | > 10,000 | 0 | 500 | 500 |
> 2000 | 100 | 300 | 500 | |
> 500 | 100 | 200 | 300 | |
≤500 | 75 | 150 | 200 |
本ごとの郵送料を計算する。注文のリストにそのための新しい欄を作る。本の全体の値段に足す。
正解の一例: ordersShipping.xsl
<xsl:apply-templates>
で複数のものの処理が可能<xsl:apply-templates select='book'/>
<xsl:sort>
で指定<xls:for-each>
<xsl:for-each
select='条件'>結果</xsl:for-each>
<xsl:apply-templates>
に
<xsl:template>
の内容をいれたもの<xsl:sort>
で順番が変更可能<xsl:for-each>
と現在のノード<xsl:for-each>
の内部には現在のノードは繰り返しの対称ノード<xsl:for-each select='book'> <xsl:apply-templates select='data/@ISBN'/> ... </xsl:for-each>
<xsl:for-each select='book'>
<xsl:apply-templates select='book/data/@ISBN'/>
...
</xsl:for-each>
<xsl:for-each>
と position()
など<xsl:for-each>
の内部で position()
は「全体の何番目」を指すlast()
は全体の数を指す<xsl:for-each select='book'> <xsl:choose> <xsl:when test='(position() mod 2) = 0'> <tr><xsl:apply-templates select='.'/></tr> </xsl:when> <xsl:when test='(position() mod 2) = 1'> <tr style='background-color: lightgreen'> <xsl:apply-templates select='.'/></tr> </xsl:when> </xsl:choose> </xsl:for-each>
<xsl:apply-templates>
で「誰かやってくれ」と要素を次々押し出す<xsl:for-each>
や
<xsl:value-of>
で必要な処理や内容を明示的に指定
(引っ張り込み)<xsl:attribute>
@name
で、属性値は
<xsl:attribute>
の内容で指定<xsl:attribute name='style'>background-color:
lightgreen</xsl:attribute>
<xsl:element>
,
<xsl:text>
, <xsl:comment>
などがある提出: 1月13日 (日曜日) 22:00 までに Moodle に投稿
本をテーブルとして出力する変換ファイルを次のように変更する:
<xsl:attribute>
を使用する提出: 1月13日 (日曜日) 22:00 までに Moodle に投稿
今まで使った簡単な変換ファイルをベースに、<xsl:apply-templates>
を少しずつ <xsl:for-each>
(や
<xsl:value-of>
) に変換。
注意: この演習はあくまで
<xsl:apply-templates>
と
<xsl:for-each>
の関係や複数の
<xsl:for-each>
の限界を実感するためのもので、このような「団子変換」を絶対使って欲しくない。