伸び縮みマークアップ言語 XML
■ 変数1

■ xsl:variable要素

xsl:variable」要素は、 XSLTスタイルシートやテンプレート内で使用する値を変数に割り当てる事ができます。 name属性変数名を、 select属性を記述し、 参照するにはXPath式で「$変数名」とします。

<xsl:variable name="変数名" select="値"/>

<xsl:value-of select="$変数名"/>

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「sample10.xml」、 XSLTスタイルシートを「test10.xsl」 として保存します。「sample10.xml」ファイルに記述する xml-stylesheet処理命令href属性に 「test10.xsl」と指定して下さい。

■ sample10.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="test10.xsl" type="text/xsl"?>
<発注>
 <商品名>XML学習教材</商品名>
 <コード>A00143</コード>
 <価格 単位="円">6400</価格>
 <数量>23</数量>
</発注>

■ test10.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="税込" select="1.05"/>
<xsl:template match="発注">
 <html>
  <body>
   <xsl:apply-templates/>
  </body>
 </html>
</xsl:template>
<xsl:template match="商品名">
 <p><b>商品名 : </b><xsl:value-of select="."/></p>
</xsl:template>
<xsl:template match="数量">
 <p><b>数量 : </b><xsl:value-of select="."/></p>
</xsl:template>
<xsl:template match="価格">
 <p><b>価格 : </b><xsl:value-of select="."/><xsl:value-of select="./@単位"/></p>
 <p><b>税込 : <xsl:value-of select=".*$税込"/>
 <xsl:value-of select="./@単位"/></b></p>
</xsl:template>
</xsl:stylesheet>

この例では、「xsl:variable」要素のname属性 に「税込」、変数「税込」に「1.05」を割り当てます。 「xsl:apply-templates」要素のselect属性で、 「発注」ノード以下の全ての子ノードを指定しています。 「価格」テンプレートの「./@単位」は「価格」要素の属性である「単位」を指します。 そして「.*$税込」で「価格×1.05」を計算して税込金額を計算します。

これらを記述してsample10.xmlファイルを開くと、(上記の2つのファイルは同じフォルダに入れて下さい。) 下記のような実行結果になります。

商品名 : XML学習教材

数量 : 23

価格 : 6400円

税込 : 147200円

XPath式の計算
XSLTスタイルシートでの計算はXPath式で行います。「()」も使用可能です。

演算子
計算
+
加算
-
減算
*
乗算
div
除算

■ 変数2

■ xsl:param要素

xsl:param」要素は、 「xsl:variable」要素と同等の機能を持ちます。 XSLTスタイルシートやテンプレートの中で使用する値を変数に割り当てる事が可能で、 name属性に変数の名前を指定し、select属性に値を記述します。 参照時も同じように、XPath式で「$変数名」を記述します。

<xsl:param name="変数名" select="値"/>

<xsl:value-of select="$変数名"/>

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「sample11.xml」、 XSLTスタイルシートを「test11.xsl」 として保存します。「sample11.xml」ファイルに記述する xml-stylesheet処理命令href属性に 「test11.xsl」と指定して下さい。

■ sample11.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="test11.xsl" type="text/xsl"?>
<発注>
 <商品名>XML学習教材</商品名>
 <コード>A00143</コード>
 <価格 単位="円">6400</価格>
 <数量>23</数量>
</発注>

■ test11.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="発注">
 <html>
  <body>
   <xsl:apply-templates select="価格"/>
  </body>
 </html>
</xsl:template>
<xsl:template match="価格">
 <p>価格 : <xsl:value-of select="."/><xsl:value-of select="./@単位"/></p>
 <xsl:call-template name="税込"/>
</xsl:template>
<xsl:template name="税込">
 <xsl:param name="税" select="1.05"/>
 <p>税込価格 : <value-of select=".*$税"/><xsl:value-of select="./@単位"/></p>
</xsl:template>
</xsl:stylesheet>

このXSLTスタイルシートでは、「価格」テンプレートから 「xsl:call-template」要素で 「税込」テンプレートを呼び出し、「税込」テンプレートの中の 「xsl:param」要素で、変数「」に 値「1.05」を設定しました。 そして「$税」で参照しています。

これらを記述してsample11.xmlファイルを開くと、(上記の2つのファイルは同じフォルダに入れて下さい。) 下記のような実行結果になります。

価格 : 6400円

税込価格 : 6720円

xsl:paramとxsl:variable
「xsl:param」要素と「xsl:variable」要素は変数として利用する場合は同じで、変数に設定された値は 変化しません。値の受け渡しが可能なパラメータとして利用することができるのは 「xsl:param」要素だけであり、設定された値の変更が可能です。

■ 変数3

■ xsl:with-param要素

xsl:with-param」要素は設定した変数の値を別のテンプレートに引き渡す事ができます。 「xsl:apply-templates」要素の内容や、 「xsl:call-template」要素で使用し、 引き渡した先のテンプレートでは「xsl:param」要素で受け取ります。

<xsl:with-param name="変数名" select="値"/>

<xsl:param name"変数名"/>

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「sample12.xml」、 XSLTスタイルシートを「test12.xsl」 として保存します。「sample12.xml」ファイルに記述する xml-stylesheet処理命令href属性に 「test12.xsl」と指定して下さい。

■ sample12.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="test12.xsl" type="text/xsl"?>
<発注>
 <商品名>XML学習教材</商品名>
 <コード>A00143</コード>
 <価格 単位="円">6400</価格>
 <数量>23</数量>
</発注>

■ test12.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="発注">
 <html>
  <body>
   <xsl:apply-templates select="価格"/>
  </body>
 </html>
</xsl:template>
<xsl:template match="価格">
 <p>価格 : <xsl:value-of select="."/><xsl:value-of select="./@単位"/></p>
 <xsl:call-template name="計算">
  <xsl:with-param name="税" select="0.05"/>
 </xsl:call-template>
 <xsl:call-template name="計算">
  <xsl:with-param name="税" select="1.05"/>
 </xsl:call-template>

</xsl:template>
<xsl:template name="計算">
 <xsl:param name="税"/>
 <p>税率 : <xsl:value-of select="$税"/>なら<xsl:value-of select=".*$税"/>
 <xsl:value-of select="./@単位"/></p>
</xsl:template>
</xsl:stylesheet>

上記のファイルでは、「計算」テンプレートで税率を変えて計算処理を行います。 「xsl:call-template」要素で「計算」テンプレートを呼び出し、 「xsl:with-param」要素で変数である「」に 「0.05」を設定します。 「計算」テンプレート内では 「xsl:param」要素で変数「」に設定した値 「0.05」を受け取り 計算処理を行います。同様にして「1.05」の場合も設定します。

これらを記述してsample12.xmlファイルを開くと、(上記の2つのファイルは同じフォルダに入れて下さい。) 下記のような実行結果になります。

価格 : 6400円

税率 : 0.05なら320円

税率 : 1.05なら6720円

■ 繰り返し処理

■ xsl:for-each要素

xsl:for-each」要素はselect属性 にXPath式で指定したノード集合の要素の数だけ処理を繰り返します。 要素の出現順に処理は行われますが、処理の順番を並べ替える事も可能です。

<xsl:for-each select="ノード集合">

テンプレートを記述

</xsl:for-each>



■ ノード集合

XML文書中で、同じ階層に同じ名前の要素があるときにXPath式でその要素の名前を指定すると、 その要素が全て指定されたことになります。 下記の例の場合はXPath式で「/地区コード/大阪」と指定すると複数のノードを対象にしたことになります。

<地区コード>
 <東京>T0034</東京>
 <東京>T0067</東京>
 <名古屋>N2298</名古屋>
 <名古屋>N0098</名古屋>
 <大阪>O8543</大阪>
 <大阪>O8665</大阪>
 <大阪>O8997</大阪>
 <大阪>O9772</大阪>
</地区コード>

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「sample13.xml」、 XSLTスタイルシートを「test13.xsl」 として保存します。「sample13.xml」ファイルに記述する xml-stylesheet処理命令href属性に 「test13.xsl」と指定して下さい。

■ sample13.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="test13.xsl" type="text/xsl"?>
<メンバー>
 <タイトル>メンバーリスト</タイトル>
 <所在地>
  <氏名>伸縮○太郎</氏名>
  <地区>大阪</地区>
 </所在地>
 <所在地>
  <氏名>伸縮○子</氏名>
  <地区>東京</地区>
 </所在地>
 <所在地>
  <氏名>伸縮○美</氏名>
  <地区>名古屋</地区>
 </所在地>
 <所在地>
  <氏名>伸縮○次</氏名>
  <地区>北海道</地区>
 </所在地>
 <所在地>
  <氏名>伸縮○香</氏名>
  <地区>千葉</地区>
 </所在地>
</メンバー>

■ test13.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="メンバー">
 <html>
  <body>
   <xsl:apply-templates select="タイトル"/>
   <ul>
    <xsl:for-each select="所在地">
     <xsl:call-template name="メンバー所在地"/>
    </xsl:for-each>

   </ul>
  </body>
 </html>
</xsl:template>
<xsl:template match="タイトル">
 <xsl:value-of select="."/>
</xsl:template>
<xsl:template name="メンバー所在地">
 <li>
  <xsl:value-of select="./地区"/>
--
  <xsl:value-of select="./氏名"/>
 </li>
</xsl:template>
</xsl:stylesheet>

上記のファイルでは、「メンバー」テンプレート内で 「タイトル」テンプレートを適用し、 「xsl:for-each」のselect属性に 「所在地」を指定することで 「所在地」のノード集合を対象にします。 そして「メンバー所在地」テンプレートを適用し、 「メンバー所在地」テンプレートで 「地区」と 「氏名」の各要素を出力します。

これらを記述してsample13.xmlファイルを開くと、(上記の2つのファイルは同じフォルダに入れて下さい。) 下記のような実行結果になります。

メンバーリスト

・伸縮○太郎--大阪
・伸縮○子--東京
・伸縮○美--名古屋
・伸縮○次--北海道
・伸縮○香--千葉

■ 再帰処理

■ 再帰処理の構造

前に説明した繰り返し処理とは異なり、決まった回数だけ処理を繰り返すには 「再帰処理」と言う方法を用います。 これは、処理を行っている途中で同じ処理を呼び出すことで、 呼び出しが無限に続かないように条件判断によって中止します。

条件判断  >> >> >> NO >> >> >>  処理終了

▼    ▲
▼    ▲
YES   処理実行
▼    ▲
▼    ▲

処理呼び出し

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「sample14.xml」、 XSLTスタイルシートを「test14.xsl」 として保存します。「sample14.xml」ファイルに記述する xml-stylesheet処理命令href属性に 「test14.xsl」と指定して下さい。

■ sample14.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="test14.xsl" type="text/xsl"?>
<再帰処理>
 <回数>10</回数>
</再帰処理>

■ test14.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="再帰処理">
 <html>
  <body>
   <xsl:call-template name="処理">
    <xsl:with-param name="処理回数" select="回数"/>
   </xsl:call-template>
  </body>
 </html>
</xsl:template>
<xsl:template name="処理">
 <xsl:param name="処理回数"/>
 <xsl:param name="繰り返し回数" select="1"/>
 <xsl:if test="$処理回数&#62;=$繰り返し回数">
 <xsl:value-of select="$繰り返し回数"/><br />
 <xsl:call-template name="処理">
  <xsl:with-param name="処理回数" select="$処理回数"/>
  <xsl:with-param name="繰り返し回数" select="$繰り返し回数+1"/>
 </xsl:call-template>
 </xsl:if>

</xsl:template>
</xsl:stylesheet>

上記のファイルでは、始めに 「処理」テンプレートを呼び出し、 「回数」要素をxml文書から取得します。 そしてそれを変数「処理回数」に割り当てます。 そしてその値を「処理」テンプレートで受け取ります。 処理を繰り返した回数を変数 「繰り返し回数」に設定、 「xsl:if」要素の属性である 「test」属性で変数「繰り返し回数」 が「処理回数」を超えたかどうかを比べ、 超えていなければ処理を続行、超えていたら処理を終了します。 (XSLTスタイルシート内に記述された「&#62;」 は「>」をそのまま記述できないために実態参照を用いて記述します)

これらを記述してsample14.xmlファイルを開くと、(上記の2つのファイルは同じフォルダに入れて下さい。) 下記のような実行結果になります。

1
2
3
4
5
6
7
8
9
10


■ データの並べ替え

■ xsl:sort要素

データの並べ替えは「xsl:sort」要素で行う事ができます。 select属性で並べ替えたいノードを指定し、 data-type属性で「text」 「number」(データ型)を指定します。 この要素は「xsl:apply-template」 「xsl:for-each」 要素の子要素として設定します。

<xsl:sort select="XPath式" data-type="データ型"/>

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「sample15.xml」、 XSLTスタイルシートを「test15.xsl」 として保存します。「sample15.xml」ファイルに記述する xml-stylesheet処理命令href属性に 「test15.xsl」と指定して下さい。

■ sample15.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="test15.xsl" type="text/xsl"?>
<会員情報>
 <会員>
  <名前>名前一郎</名前>
  <クラス>B</クラス>
  <番号>4</番号>
  <総合時間>18</総合時間>
 </会員>
 <会員>
  <名前>名前二郎</名前>
  <クラス>A</クラス>
  <番号>2</番号>
  <総合時間>20</総合時間>
 </会員>
 <会員>
  <名前>名前三郎</名前>
  <クラス>B</クラス>
  <番号>6</番号>
  <総合時間>30</総合時間>
 </会員>
 <会員>
  <名前>名前四郎</名前>
  <クラス>D</クラス>
  <番号>9</番号>
  <総合時間>18</総合時間>
 </会員>
</会員情報>

■ test15.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="会員情報">
 <html>
  <body>
   <h2>出現順</h2>
   <xsl:apply-templates select="会員"/>
   <h2>番号の昇順</h2>
   <xsl:apply-templates select="会員">
    <xsl:sort select="番号" data-type="number"/>
   </xsl:apply-templates>
  </body>
 </html>
</xsl:template>
<xsl:template match="会員">
 <p>
  <b><xsl:value-of select="名前"/>・・</b>
  番号:<xsl:value-of select="番号"/>
  クラス:<xsl:value-of select="クラス"/>
  総合時間:<xsl:value-of select="総合時間"/>
 </p>
</xsl:template>
</xsl:stylesheet>

上記のファイルでは、始めに データをXML文書に記述した順(出現順)に表示させ、 次にデータを「番号」要素の昇順に並べ替え、表示します。 「xsl:sort」要素のselect属性に 「番号」を指定して、 data-type属性に「number」を設定します。 data-type属性には並べ替えるデータによって 「text」(文字列) 「number」(数値) を指定しますが、数値データの場合に「text」を設定すると、 正しく並べ替えられない事があるので注意して下さい。

これらを記述してsample15.xmlファイルを開くと、(上記の2つのファイルは同じフォルダに入れて下さい。) 下記のような実行結果になります。

出現順

名前一郎・・番号:4 クラス:B 総合時間:18
名前二郎・・番号:2 クラス:A 総合時間:20
名前三郎・・番号:6 クラス:B 総合時間:30
名前四郎・・番号:9 クラス:D 総合時間:18

番号順

名前二郎・・番号:2 クラス:A 総合時間:20
名前一郎・・番号:4 クラス:B 総合時間:18
名前三郎・・番号:6 クラス:B 総合時間:30
名前四郎・・番号:9 クラス:D 総合時間:18


上記の例では、データを昇順に並べ替えて表示しました。 「xsl:sort」要素は昇順だけでなく、 降順にも並べ替える事ができます。 降順に並べ替えるには「order」属性に 「ascending」を指定すると昇順に、 「descending」を指定すると、降順に並べる事ができます。 「order」属性を省略した場合は昇順に並びます。

上記と同じファイルを使用して test15.xslファイルの「xsl:sort」要素の 「order」属性に 「descending」を指定します。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="会員情報">
 <html>
  <body>
   <h2>出現順</h2>
   <xsl:apply-templates select="会員"/>
   <h2>番号の昇順</h2>
   <xsl:apply-templates select="会員">
    <xsl:sort select="番号" data-type="number" order="descending"/>
   </xsl:apply-templates>
  </body>
 </html>
</xsl:template>
<xsl:template match="会員">
 <p>
  <b><xsl:value-of select="名前"/>・・</b>
  番号:<xsl:value-of select="番号"/>
  クラス:<xsl:value-of select="クラス"/>
  総合時間:<xsl:value-of select="総合時間"/>
 </p>
</xsl:template>
</xsl:stylesheet>

これらを記述してsample15.xmlファイルを開くと、(上記の2つのファイルは同じフォルダに入れて下さい。) 下記のような実行結果になります。

出現順

名前一郎・・番号:4 クラス:B 総合時間:18
名前二郎・・番号:2 クラス:A 総合時間:20
名前三郎・・番号:6 クラス:B 総合時間:30
名前四郎・・番号:9 クラス:D 総合時間:18

番号順

名前四郎・・番号:9 クラス:D 総合時間:18
名前三郎・・番号:6 クラス:B 総合時間:30
名前一郎・・番号:4 クラス:B 総合時間:18
名前二郎・・番号:2 クラス:A 総合時間:20


■ データに番号をつけて出力

■ xsl:number要素

データに番号をつけて出力するには、「xsl:number」を使用します。 データに番号をつけるには、テンプレートの中に 「<xsl:number/>」を記述します。 また、「xsl:number」にformat属性 を記述し、値を指定すると数字以外の 番号付けをする事が可能です。

format属性の値
文字列 出力される番号
1 1 2 3 4 5 6・・
01 01 02 03・・
A A B C D・・AA AB
a a b c d・・aa ab
i ⅰⅱⅲ・・
I ⅠⅡⅢ・・

<xsl:number/>
<xsl:value-of select="要素名"/>

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「sample16.xml」、 XSLTスタイルシートを「test16.xsl」 として保存します。「sample16.xml」ファイルに記述する xml-stylesheet処理命令href属性に 「test16.xsl」と指定して下さい。

■ sample16.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="test16.xsl" type="text/xsl"?>
<会員>
 <名前>名前一郎</名前>
 <名前>名前二郎</名前>
 <名前>名前三郎</名前>
 <名前>名前四郎</名前>
</会員>

■ test16.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="会員">
  <html>
   <body>
    <xsl:apply-templates select="名前"/>
   </body>
  </html>
 </xsl:template>
<xsl:template match="名前">
 <p>
  <xsl:number/>
  :
  <xsl:value-of select="."/>
  </p>
 </xsl:template>
</xsl:stylesheet>

上記のファイルでは、「xsl:number」要素を 「会員」テンプレートに 記述しています。

これらを記述してsample16.xmlファイルを開くと、(上記の2つのファイルは同じフォルダに入れて下さい。) 下記のような実行結果になります。

1:名前一郎

2:名前二郎

3:名前三郎

4:名前四郎


■ 条件式に一致時のみ変換処理を実施

■ xsl:if要素

xsl:if」要素の「test」 属性に指定した条件式が成り立つ時(真)のみテンプレートルールを 適用します。条件が成り立たない時(偽)は処理を行いません。

条件式は比較演算子で構成します。 その際、論理演算子で複数の条件式を組み合わせる事も可能です。 「<」と「>」はそのまま記述する事はできないので、「&#60;」「&#62;」 (「&lt;」「&gt;」でもよい)を記述します。

条件式
比較演算子 説明
a = b aとbは等しい
a < b aはbよりも小さい
a > b aはbよりも大きい
a != b aとbは等しくない
a <= b aはbよりも小さいか等しい
a >= b aはbよりも大きいか等しい

論理演算子 説明
and かつ
or または

<xsl:if test="条件式">
ここにテンプレートを記述
</xsl:if>

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「sample17.xml」、 XSLTスタイルシートを「test17.xsl」 として保存します。「sample17.xml」ファイルに記述する xml-stylesheet処理命令href属性に 「test17.xsl」と指定して下さい。

■ sample17.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="test17.xsl" type="text/xsl"?>
<契約期間>
 <会員>
  <名前>名前一郎</名前>
  <契約年>2002</契約年>
  <契約期限>2006</契約期限>
 </会員>
 <会員>
  <名前>名前二郎</名前>
  <契約年>2003</契約年>
  <契約期限>2004</契約期限>
 </会員>
 <会員>
  <名前>名前三郎</名前>
  <契約年>2004</契約年>
  <契約期限>2007</契約期限>
 </会員>
</契約期間>

■ test17.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="契約期間">
  <html>
   <body>
    <xsl:apply-templates select="会員"/>
   </body>
  </html>
 </xsl:template>
 <xsl:template match="会員">
  <p>
   <xsl:value-of select="名前"/>
   ・・
   契約年 <xsl:value-of select="契約年"/>
   契約期限 <xsl:value-of select="契約期限"/>
   <xsl:if test="契約期限 &#60;= 2004">■期限切れ間近■</xsl:if>
  </p>
 </xsl:template>
</xsl:stylesheet>

上記のファイルでは、「xsl:if」要素の「test」属性 に条件式「契約期限 &#60;= 2004」を記述し、 条件が成り立つ場合に「■期限切れ間近■」を表示します。 この場合だと、契約期限が2004よりも小さいか同じ場合に処理が実施されます。 なお、そのまま記述できない「<」は定義済み実体で記述しています。

これらを記述してsample17.xmlファイルを開くと、(上記の2つのファイルは同じフォルダに入れて下さい。) 下記のような実行結果になります。

名前一郎・・契約年 2002 契約期限 2006

名前二郎・・契約年 2003 契約期限 2004■期限切れ間近■

名前三郎・・契約年 2004 契約期限 2007


■ 複数の条件を設定して処理を制御

■ xsl:choose要素

複数の条件を設定して処理を制御するには、 「xsl:choose」要素に「xsl:when」要素と 「xsl:otherwise」要素を組み合わせて使用します。 test属性に設定されている条件式が 始めに真になった「xsl:when」要素のテンプレートのルール が適用され、どの「xsl:when」要素も偽になった場合に 「xsl:otherwise」要素のテンプレートルールが適用されます。 「xsl:when」要素は複数設定できます。

<xsl:choose>
 <xsl:when test="条件式">
 ・・ テンプレート・・
 </xsl:when>
 <xsl:otherwise>
 ・・ テンプレート・・
 </xsl:otherwise>
</xsl:choose>

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「sample18.xml」、 XSLTスタイルシートを「test18.xsl」 として保存します。「sample18.xml」ファイルに記述する xml-stylesheet処理命令href属性に 「test18.xsl」と指定して下さい。

■ sample18.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="test18.xsl" type="text/xsl"?>
<入荷予定>
<商品>
 <商品名>学ぼうXML</商品名>
 <数量>30</数量>
 <価格>2500</価格>
 <入荷月>10</入荷月>
</商品>
<商品>
 <商品名>DOSとコマンドプロンプトの違いって?</商品名>
 <数量>10</数量>
 <価格>3400</価格>
 <入荷月>12</入荷月>
</商品>
<商品>
 <商品名>スタイルシートサンプル集</商品名>
 <数量>50</数量>
 <価格>1800</価格>
 <入荷月>11</入荷月>
</商品>
</入荷予定>

■ test18.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="入荷予定">
 <html>
  <body>
   <xsl:apply-templates select="商品">
   <xsl:sort select="入荷月" data-type="number"/>
   </xsl:apply-templates>
  </body>
 </html>
</xsl:template>
<xsl:template match="商品">
 <p>
  <xsl:choose>
   <xsl:when test="position()=1">
    <xsl:text>1番目 </xsl:text>
   </xsl:when>
   <xsl:when test="position()=last()">
    <xsl:text>3番目 </xsl:text>
   </xsl:when>
   <xsl:otherwise>
    <xsl:value-of select="position()"/>
    <xsl:text>番目 </xsl:text>
   </xsl:otherwise>
  </xsl:choose>

  <xsl:value-of select="商品名"/> を
  <xsl:value-of select="入荷月"/> 月に
  <xsl:value-of select="数量"/> 発注すること。
 </p>
</xsl:template>
</xsl:stylesheet>

この例では、 データを「入荷月」要素で「xsl:sort」要素で昇順に並べ、 それを「xsl:choose」要素を使用して複数の条件を設定して処理を制御しています。 ここで「position」関数を使用して「xsl:when」要素の test属性に 「入荷月」要素の中で一番小さい数字を持つ商品を示す 「position()=1」を指定、 「position()=last()」で最も大きい数字を待つ商品を、 どちらにも当てはまらない場合は「xsl:otherwise」要素で順番を 「position」関数で取得しています。 なお、関数については、また後々説明します。 ここではこういう働きをするのだということだけを理解して下さい。

これらを記述してsample18.xmlファイルを開くと、(上記の2つのファイルは同じフォルダに入れて下さい。) 下記のような実行結果になります。

1番目 学ぼうXML を 10 月に 30 発注すること。

2番目 スタイルシートサンプル集 を 11 月に 50 発注すること。

3番目 DOSとコマンドプロンプトの違いって? を 12 月に 10 発注すること。


■ XSLTスタイルシートに別のXSLTスタイルシートを読み込む

■ xsl:import・xsl:include要素

XSLTスタイルシートに他のXSLTスタイルシートを読み込むには、 「xsl:import」か「xsl:include」要素を使用します。 これらの要素にhref属性を記述して値にファイル名を設定すると、 他のXSLTスタイルシートを取り込む事が出来ます。 「xsl:include」要素は、取り込んだスタイルシートファイルに 同じ要素があると置き換え、「xsl:import」要素は 取り込んだスタイルシートファイルを優先します。

xsl:include要素は、トップレベル要素の位置ならどこにでも記述する事が可能ですが、 xsl:import要素はxsl:stylesheet要素の、子要素の先頭に記述しなければなりません。

<xsl:import href="ファイルのパス">
<xsl:include href="ファイルのパス">

では、例題を取り上げてみましょう。
以下の2つのファイルをご覧下さい。XML文書を「sample19.xml」、 XSLTスタイルシートを「test19.xsl」 として保存します。「sample19.xml」ファイルに記述する xml-stylesheet処理命令href属性に 「test19.xsl」と指定して下さい。

そしてここではもう一つ、読み込む為のXSLTスタイルシートを 「test19_1.xsl」として作成します。

■ sample19.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet href="test19.xsl" type="text/xsl"?>
<在庫>
 <本>
  <品名>完璧マスターXML</品名>
  <数量>30</数量>
 </本>
 <本>
  <品名>HTMLを追求する</品名>
  <数量>16</数量>
 </本>
</在庫>

■ test19.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:import href="test19_1.xsl"/>
</xsl:stylesheet>

■ test19_1.xsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="在庫">
  <html>
   <body>
    <h2>在庫状況</h2>
    <ul><xsl:apply-templates select="本"/></ul>
   </body>
  </html>
 </xsl:template>
 <xsl:template match="本">
  <li><xsl:value-of select="./品名"/>・・<xsl:value-of select="./数量"/></li>
 </xsl:template>
</xsl:stylesheet>

この例では、 「test19.xsl」では何もテンプレートを記述せず、 「xsl:import」要素によって読み込まれた「test19_1.xsl」に 記述されたテンプレートを適用して処理を行っています。

これらを記述してsample19.xmlファイルを開くと、(上記の2つのファイルは同じフォルダに入れて下さい。) 下記のような実行結果になります。

在庫状況

 ・完璧マスターXML・・30
 ・HTMLを追求する・・16


■ XSLT関数について

■ 関数について

XSLTの関数は「xsl:value-of」要素の select属性などに使用し、それらには 文字列や数値、またノードを操作するものがあります。

xsl:include要素は、トップレベル要素の位置ならどこにでも記述する事が可能ですが、 xsl:import要素はxsl:stylesheet要素の、子要素の先頭に記述しなければなりません。

<xsl:value-of select="関数を記述"/>

では、ここではよく使用する関数をいくつかご紹介します。

■ 文字列の置換

<xsl:value-of select="translate('XML','M','S')"/>

translate関数を使用すると、文字の置換を行うことができます。 関数の()内には、「置換する文字列,置換前の文字,置換後の文字」 の順に指定します。上記の例では「XML」から「XSL」に置換されます。

■ 文字列の連結

<xsl:value-of select="concat('関数の','概要')"/>

concat関数を使用すると、文字の連結を行うことができます。 繋ぎ合わせたい文字列は2つ以上指定して下さい。

■ 加算

XML文書
<商品数>
 <数量>33</数量>
 <数量>123</数量>
 <数量>75</数量>
 <数量>8</数量>
 <数量>34</数量>
</商品数>

XSLTスタイルシート
<xsl:template match="商品数">
 <xsl:value-of select="sum(数量)"/>
</xsl:template>

sum関数を使用すると、指定した全ての数値を加算する事ができます。 上記のコードの結果は、「273」と表示されます。

■ ノード関数

<xsl:template match="XPath式">
 <xsl:value-of select="last()"/>
 <xsl:value-of select="position()"/>
 <xsl:value-of select="current()"/>
</xsl:template>

ノード関数を使用すると、現在の位置や処理中のタグの名称などを知ることが可能です。
 ・last関数・・・・最後に出現するノードの番号を返す。
 ・position関数・・現在処理中のノードの位置を番号で返す。
 ・current関数 ・・現在処理中のノードを返す。

他にも沢山関数はありますが、以下によく使用する関数をあげました。

文字列関数
関数 説明
concat 文字列を連結して返す
string 文字列に変換して返す
contains("x","y") 文字列 x が文字列 y を含んでいると真を返す

数値関数
関数 説明
sum ノードの合計数値を返す
number 数値に変換して返す
round 四捨五入した整数値を返す
ceiling 小数点以下を切り上げた整数値を返す
floor 小数点以下を切り捨てた整数値を返す

ノード集合関数
関数 説明
name 引数に指定したノード集合の最初のノードの名前を返す
count 引数に指定したノード集合に含まれるノード数を返す
last 集合の中のノード数を数値で返す
position コンテキストノードの集合内で何番目かを数値で返す

«««« back           next »»»»
 
XMLとは
XML文書作成の大まかな流れ
XML文書の記述
XML文書ブラウザでの表示
XSLTスタイルシートの適用
XSLTの構造
XML文書の宣言
文字コードの設定
タグ付けのルール
要素名・属性の指定について
階層構造
実体参照・文字参照について
その他・コメントや処理
DTDの記述
名前空間の指定
情報をデータ化する
階層構造の作成
データからXML文書を作成する
会員情報の記述ルールを定義したDTD..
個々のXML文書を作成する
外部実体参照
テンプレートルール
XSLTスタイルシートを記述する 【ノード】
構造を変換する仕組み
テンプレートルールの定義
テンプレートの動作確認
XPathの仕組み  【XPathの関数】
XPathの表記方法
テキストの抽出  xsl:value-of
ノードのコピー  xsl:copy-of
テキストの生成  xsl:text
コメントの生成  xsl:comment
要素の生成  xsl:element
属性の生成  xsl:attribute
属性値の生成  【属性値テンプレート】
出力方法の指定  xsl:output
変数1  xsl:variable
変数2  xsl:param
変数3  xsl:with-param
繰り返し処理  xsl:for-each
再帰処理  xsl:if test
データの並べ替え  xsl:sort
データに番号をつけて出力  xsl:number
条件式に一致時のみ変換処理を実施 xsl:if
複数条件を設定して処理 xsl:choose
XSLTに別のXSLT.. xsl:import xsl:include
XSLT関数について
データを1件表示
データを決められた件数だけ表示
テキストと要素混在時のテキスト抽出法
データを全て表示する
表示するデータを並べ替える
条件式を設定して表示を変える
データを表にして表示する
複数件のデータを1つの表にして表示
リンクを加える  xsl:element xsl:attribute
データをCSV形式で出力する
DOM(Document Object Model)
DOMとjavascript
ノードにアクセスする
ノードにアクセスする 2
ノードにアクセスする 3
XSLTスタイルシートを読み込む
XSLTスタイルシートの切り替え
DOMとjavascriptで検索機能を作成する 1
DOMとjavascriptで検索機能を作成する 2
DOMとjavascriptで検索機能を作成する 3
DOMとjavascriptで検索機能を作成する (XSLTスタイルシート適用)
SVG(Scalable Vector Graphics)
SVG(Scalable Vector Graphics)の基本
「g」タグによるグループ化
図形の座標変換 transform属性
アニメーションを作成する animate要素
アニメーションを作成する animate要素2
イベント
DOMとJavaScriptを使用したイベント処理
XMLとXSLTからSVGを生成する
msxsl.exeのオプション
エラーメッセージの表示
XML(eXtensible Markup Language) バナーはダウ
ンロードして
お使い下さい。




Copyright © 2004 - ykr414 . All Rights Reserved.