目次へ

3.9 属性値テンプレート

属性値にリテラルの値を指定して出力を行うことは容易にできます。しかし、スタイルシートを記述している時点で属性値がわかっていないと指定することはできません。属性値テンプレートを使用すると属性値を動的に生成することが可能となります。属性値テンプレートは、中括弧 "{ }" で囲まれた XPath の式として記述します。属性値テンプレートは、式とそれを囲む中括弧を式の評価結果で置き換え、結果のオブジェクトに対し string 関数を実行したかのように、文字列に変換されます。

<xsl:template match="root_before">
  <root pic="{pic_before}"
        info="{info_before}" />
</xsl:template>

上記のテンプレートを info.xml に適用すると以下の結果を得られます。

<root info="information" pic="pic.jpg"/>

3.10 ナンバリング

<xsl:number
  level = "single" | "multiple" | "any"
  count = pattern
  from = pattern
  value = number-expression
  format = { string }
  lang = { nmtoken }
  letter-value = { "alphabetic" | "traditional" }
  grouping-separator = { char }
  grouping-size = { number } />

xsl:number 要素は、結果ツリーに整形された整数を挿入します。

value は任意属性で、整形される数値を返す XPath 式を指定します。式が評価されると XPath の number 関数の呼び出しを実行したかのように数値に変換されます。ただし、変換された結果の数値が NaN や無限大あるいは 0.5 未満の場合はエラーとなります。value 属性を指定していない場合、xsl:number 要素はソースツリー内のカレントノードの位置に基づいて数値を挿入します。位置は、level 属性、count 属性、および from 属性によって指定され計算されます。

level は任意属性で、カレントノードのポジションの決定をソースツリーのどのレベルで考えるべきかを指定します。属性値としては、single、multiple、または any を持ちます。count パターンにマッチするカレントノードの祖先に先行する兄弟を数える場合には、single を指定します。count パターンにマッチし、カレントノードに先行する文書内のすべてのノードを数える場合には、any を指定します。"1.2.1" といった階層的な数値の並びを生成する場合には、multiple を指定します。並びのそれぞれの数値は、count パターンにマッチし、先行する兄弟の祖先から計算されます。デフォルト値は、single です。

count は任意属性で、level 属性で指定したレベルにおいて、カウントすべきノードを指定するパターンをロケーションパス式で指定します。 count 属性が指定されていない場合、カレントノードと同じノード型を持つすべてのノードにマッチするパターンがデフォルト値となり、カレントノードと同じ名前を持つすべてのノードを数えます。

from は任意属性で、カウントを開始する場所をロケーションパス式で指定します。

format は任意属性で、リストがどのようにナンバリングされるかを指定します。属性値と生成される順序の関係は、以下の通りです。

属性値 生成される順序
1 1, 2, 3, ...
01 01, 02, 03, ... 99, 100, ...
A A, B, C, ... Z, AA, AB, AC, ...
a a, b, c, ... z, aa, ab, ac, ...
i i, ii, iii, ...
I I, II, III, ...

lang は任意属性で、その数値を整形する言語を表す RFC 1766 の言語コード (en や fr など) を指定します。

letter-value は任意属性で、属性値に alphabetic を指定すると、format 属性の値が "I" の場合、I,II,III,... という順序ではなく、I,J,K,...という順序でナンバリングすることを指定することができます。デフォルト値は traditional です。

grouping-separator は任意属性で、数字の桁を区切る文字を指定します。たとえば、日本では、2,987,667,342 のように数字 3つおきにカンマで区切ります。フランスではカンマの代わりにスペースが使われます。したがって、先の数値は 2 987 667 342 と整形されることになります。

grouping-size は任意属性で、何桁で数値を区切るかを指定します。

たとえば、grouping-separator="," grouping-size="3" と指定すると、1,000,000 といった形式で数値が出力されます。grouping-separator 属性と grouping-size 属性のどちらか一方しか指定しない場合には、その指定は無効となります。

<root>
  <info>info1</info>
  <info>info2</info>
  <info>info3</info>
</root>

上記のXML文書に下記のテンプレートを適用すると、

<xsl:template match="root/info">
  <xsl:number format="01" />:<xsl:value-of select="."/>
</xsl:template>

以下の結果を得られます。

01:info1
02:info2
03:info3

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp