W3C勧告XSLTのバージョンXSLT 2.0の「Numbering / 連番・番号付け」
XSL Transformations (XSLT) Version 2.0 / W3C Recommendation 23 January 2007の目次に沿った日本語訳です。
当サイト管理人が2009年04月、意訳したものですが、構文解釈の違いや翻訳の違いが含まれるかもしれません。正式文書はW3C 各種仕様書(英語版)である事を予めご了承ください。
<< 11. ノード生成と順番 / Creating Nodes and Sequences
12 連番・番号付け / Numbering 12.1 供給番号初期化 12.2 文書内の位置に基づく番号付け 12.3 文字列変換属性に採番する Number to String Conversion Attributes |
<!-- カテゴリ: 命令
-->
<xsl:number
value? = expression
select? = expression
level? = "single" | "multiple" | "any"
count? = pattern
from? = pattern
format? = { string }
lang? = { nmtoken }
letter-value? = { "alphabetic" | "traditional"
}
ordinal? = { string }
grouping-separator? = { char }
grouping-size? = { number
} />
xsl:number
は、フォーマット番号を作成する為に利用される命令です。命令の結果は、そのstring 値としてのフォーマット番号を含んでいるテキストノードを新たに構築されます。
[定義:
xsl:number
命令は、2つのタスク(処理)を実行します:
1つめは、位置マーカーを決定する事 (これは、 1.12.2
、または、 3(c)ii
のような階層の連番スキーマにおいて許容する為の整数のシーケンスです)、
そして2つめは、結果シーケンスにあるテキストノードとして出力する為に 位置マーカー をフォーマットする事。
]
そのフォーマットした位置マーカーは、 value
属性内で直接提供されるか、または、それを含むツリーにある選択したノードの位置を基準として算出される事、のいずれかが可能です。
[ERR XTSE0975]
もし、 xsl:number
の value
属性が存在する場合には、 select
、 level
、 count
、 from
属性が、すべて欠如している場合を除き、それは、静的エラーです。
注釈:
このセクションの中で記述した利便性は、特に計算を可能とする為とセクション番号、段落番号等々をフォーマットをする事を可能とする為に設計されます。
他の数量のフォーマットについては、 format-number
関数が、より適している場合があります。:16.4 数字フォーマット参照。
初期化される為の位置マーカーは、式によって記述される場合があります。
value
属性は、式を含みます。この式の値は、[XPath 2.0]の中で定義したプロシージャを利用して原子化 され、原子化されたシーケンスにある $V というそれぞれの値は、その際にXPath式 xs:integer(round(number($V)))
によって返された整数値に変換されます。
その結果、整数のシーケンスは、初期化される為にマーカー位置として利用されます。
もし、後方互換性動作が、その命令の為に利用可能にされた場合には:
1つめ以降の原子化したシーケンスにある全てのアイテムは、廃棄されます;
もし、原子化したシーケンスが、カラである場合には、それは、そのアイテムに限定するものとして xs:double
値 NaN
を含んでいるシーケンスによって置き換えられます;
もし、シーケンスにあるいくつかの値が、整数に変換される事が出来ない場合( NaN
値を含むシーケンスのケースを含む)には、
文字列 NaN
は、その妥当な位置にあるフォーマットした結果文字列に挿入されます。
エラーは、このケースで適用しない次に続く段落の中で記述しました。
[ERR XTDE0980]
もし、 整数に変換される事ができない xsl:number
の value
属性の値として提供した原子化したシーケンスにあるいくつかの廃棄されないアイテム、
または、結果として整数が、0 (ゼロ)よりも小さい場合には、それは、回復されない動的エラーです。
注釈:
値ゼロは、ソース文書にあるノードを番号付けしますが、他のシーケンスを番号付けする中に現れる事が可能である際には、現れません。
具体的に言うと、 xsl:number
命令の規則が、 format-time
のような関数によっても実行されるので、それは、許容されます:
時間(time)値の分(minutes)と秒(seconds)コンポーネントは、基準に合ったゼロとなる事が可能です。
結果となるシーケンスは、12.3 数字文字列変換属性で記述した属性の有効な値を利用する文字列としてフォーマットされます。;
これらそれぞれの属性は、属性値テンプレートとして解釈されます。
変換後、xsl:number
要素は、結果となる文字列を含んでいる新しいテキストノードを構築し、このノードを返します。
もし、記述されるvalue
属性がない場合には、そのxsl:number
命令は、その含んでいる文書内にある選択されたノードの位置を基準にされた位置マーカーの初期化を含んでいる新しいテキストノードを返します。
もし、 select
属性が存在する場合には、 select
属性の中で含んだ式は、選択したノードを決める為に評価されます。
もし、 select
属性が、省略される場合には、選択したノードは、文脈ノードです。
[ERR XTTE0990]
もし、 xsl:number
命令が、文脈アイテムがノードがない時に、存在しない value
、または、 select
属性を伴って評価される場合には、
それは、タイプエラーです。
[ERR XTTE1000]
もし、 xsl:number
命令の select
属性を評価した結果が、単独のノードではなく、他の何かであった場合には、
それは、タイプエラーです。
次に続く属性は、選択したノードが番号付けされる方法を操作します:
level
属性は、領域確保された番号にあるアカウントに取得されるノードを選択する為に規則を記述します;
それは、値 single
、 multiple
、または、 any
を持ちます。
既定は、 single
です。
count
属性は、それらのレベルでカウントされる為にあるノードを記述するパターンです。
もし、 count
属性が、記述されない場合には、
もし、選択したノードとして同じ拡張QNameを伴う拡張QNameを持つ場合には、
それは、選択したノードとして同じノード種別を伴ういくつかのノードとマッチするパターンの為に既定です。
from
属性は、カウントを開始する場合に記述するパターンです。
付記すると、12.3 文字列変換属性に採番するで記述したその属性は、 value
属性が記述される際のケースにあるものとして文字列変換に番号付けする為に利用されます。
xsl:number
要素は、 level
、 count
と from
属性を利用して正の整数のシーケンスを最初に構築し、
level
が、 single
、または、 any
である場合には、 このシーケンスは、カラになるか、単独の数字を含むでしょう;
level
が、 multiple
である場合には、シーケンスは、いくつかの長さとしてある場合があります。
そのシーケンスは次のように構築されます:
matches-count($node)
が
もし、仮に、単に count
属性の中で与えられるパターンとマッチするノード $node
を与えられる、
または、仮に、 count
属性が省略される場合には、(上で与えられる規則に一致する)パターンを伴う、「true」を返す関数になるとしましょう。
matches-from($node)
が
もし、単に
仮に与えられるノード $node
が、 from
属性で与えられるパターンとマッチし、
または、仮に、 $node
が、ツリーのルートノードである場合に、「true」を返す関数になるとしましょう。
もし、その from
属性が、省略される場合には、もし、ツリーのルートノードである $node
である場合に限っては、関数は、「true」を返すものとします。
$S
は、選択したノードであるものとします。
level="single"
の際には:
$A
は、次に続く式によって選択したノードシーケンスであるものとします:
$S/ancestor-or-self::node()[matches-count(.)][1]
(これは、 count
パターンにマッチする最も内側の ancestor-or-self ノードを選択します)
$F
は、式によって選択したノードシーケンスであるものとします
$S/ancestor-or-self::node()[matches-from(.)][1]
(これは、 from
パターンにマッチする最も内側の ancestor-or-self ノードを選択します):
$AF
は、(以下の)値であるものとします: $A[ancestor-or-self::node()[. is $F]]
(これは、もし、 $F をルートとしたサブツリーの中にある、または、カラのシーケンスが他にある場合には、 $A を選択します)
もし、 $AF
がカラである場合には、カラのシーケンス ()
を返します
他のものは、(以下の)値を返します:
1 + count($AF/preceding-sibling::node()[matches-count(.)])
( count
パターンプラス1(countに1を加えた・count+1)とマッチするカウントしたノードの先行する氏族の数字)。
level="multiple"
の際には:
$A
は、式によって選択したノードシーケンスであるものとします
$S/ancestor-or-self::node()[matches-count(.)]
( count
パターンとマッチする ancestor-or-self ノードのセット)
$F
は、式によって選択したノードシーケンスであるものとします
$S/ancestor-or-self::node()[matches-from(.)][1]
( from
パターンとマッチする最も内側の ancestor-or-self ノード)
$AF
は、(以下の)値であるものとします
$A[ancestor-or-self::node()[. is $F]]
(最初のステップで選択したノードは、2つめのステップで選択したノードをルートとしたサブツリーの中にあります)
式の結果を返しましょう
for $af in $AF return 1+count($af/preceding-sibling::node()[matches-count(.)])
(整数のシーケンスは、これらのノードのそれぞれを含んでおり、 count
パターンにマッチする先行する氏族の数字に1を加えます)
level="any"
の際には:
$A
は、式によって選択したノードシーケンスであるものとします
$S/(preceding::node()|ancestor-or-self::node())[matches-count(.)]
(属性と名前空間ではなく、全てのノードを一緒に伴って選択したノードで構成するノードのセットは、
文書命令の中にある選択したノードに先行し、それらがマッチする count
パターンが提供されます)
$F
は、式によって選択したノードシーケンスであるものとします
$S/(preceding::node()|ancestor::node())[matches-from(.)][last()]
( from
パターンにマッチする文書命令にある最後のノードと選択したノードに先行するノードは同じ定義を利用しています)
$AF
は、ノードシーケンス $A[. is $F or . >> $F]
であるものとします。
(最初のステップで選択したノードは、2つめのステップで選択したノードに先行するそれらを排除します。)
もし、 $AF
がカラである場合には、カラのシーケンス ()
を返します
その他のものは、式 count($AF)
の値を返します
数字のシーケンス(位置マーカー)は、その時12.3 文字列変換属性の為の数字で記述した属性の有効な値を利用して文字列に変換されます;
これらの属性のそれぞれは、属性値テンプレートとして解釈されます。
変換後、結果となる文字列は、 xsl:number
命令の結果を形成するテキストノードを作成する為に利用されます。
次に続くのは、命令したリストにあるアイテムに採番するでしょう:
<xsl:template match="ol/item"> <fo:block> <xsl:number/> <xsl:text>. </xsl:text> <xsl:apply-templates/> </fo:block> </xsl:template>
次に続く2つの規則は、数字 title
要素でしょう。
これは、サブセクションを含んで戻る中にあるセクションを含む章と巻末両方の場合の巻末のシーケンスによって続いた章のシーケンスを含む文書において意図されます。
章は、 1 、 2 、 3 という番号であり;巻末は、 A 、 B 、 C と番号付けされ;章にあるセクションは、 1.1 、 1.2 、 1.3 と番号付けされ;
巻末にあるセクションは、 A.1、 A.2、 A.3 と番号付けされます。
章の中にあるサブセクションは、 1.1.1 、 1.1.2 、 1.1.3 と番号付けされ;巻末にあるサブセクションは、 A.1.1 、 A.1.2 、 A.1.3 と番号付けされます。
<xsl:template match="title"> <fo:block> <xsl:number level="multiple" count="chapter|section|subsection" format="1.1 "/> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="appendix//title" priority="1"> <fo:block> <xsl:number level="multiple" count="appendix|section|subsection" format="A.1 "/> <xsl:apply-templates/> </fo:block> </xsl:template>
次に続く属性は、文字列に数字のシーケンスとしての変換を操作する為に利用されます。 数字は、 0 (ゼロ)より大きいまたは、等しい整数です。 その属性は、すべてオプションです。
主な属性は、 format
です。
format
属性における既定値は、 1
です。
format
属性は、それぞれのトークンが英数字文字列の最大シーケンス、または、英数字でない文字列の最大シーケンスである場合のトークンのシーケンスを分割します。
英数字は、いくつかの文字列を意味しており、それは、Nd、 Nl、 No、 Lu、 Ll、 Lt、 Lm、または、LoというUnicodeカテゴリを持ちます。
英数字トークン (フォーマットトークン)は、シーケンスにある数字ごとに利用される為のフォーマットを示します;
たいていのケースでは、フォーマットトークンは、数字の1という表現を要求した時と同じです。
それぞれの英数字でないトークンは、前置詞、セパレータ、または、後置詞のいずれかです。 もし、英数字でないトークンがあり、しかし、存在しないフォーマットトークンである場合には、単独の英数字でないトークンは、前置詞と後置詞の両方として利用されます。 前置詞が、もし、存在する場合には、最初のフォーマットトークンに先行する英数字でないトークンです。: 前置詞は、常に開始位置で構築した文字列の中に確実に1回出現します。 後置詞は、もし、存在する場合には、最後のフォーマットトークンに続く英数字でないトークンです。: 後置詞は、常に終了位置で構築した文字列の中に確実に1回出現します。 他の全ての英数字でないトークン(2つのトークン間に出現するそれら)は、 セパレータトークン であり、シーケンスにある数字の分割の為に利用されます。
n 番めのフォーマットトークンは、シーケンスにある n 番めの数字のフォーマットの為に利用されます。
もし、フォーマットトークン以上の数字がある場合には、最後のフォーマットトークンは、そのままの数字をフォーマットする為に利用されます。
もし、存在しないフォーマットトークンがある場合には、 全ての数字フォーマットに 1
のフォーマットトークンが利用されます。
先頭の後の各数字は、その番号をフォーマットする為に利用されるフォーマットトークンに先行するセパレータトークンによって先行している数字から、または、もし、それが最初のフォーマットトークンである場合には、 .
(dot)によって最初が分割されます。
フォーマットトークンは、次に続くように解釈されます:
最後の文字が、(Unicode文字プロパティデータベースで記述したように)1という値の十進アラビア数字を持ち、そして先行する文字のUnicode値が、各数字が少なくともフォーマットトークンと同じ長さであるいくつかのトークンの場合には、数字の十進表現を生成する最後の文字のUnicode 値よりも小さくなります。
十進表現の中で利用したアラビア数字は、フォーマットトークンの中で利用したアラビア数字文字を含むアラビア数字のセットです。
このように、フォーマットトークン 1
は、シーケンス 0 1 2 ... 10 11 12 ...
を生成し、
フォーマットトークン 01
は、シーケンス 00 01 02 ... 09 10 11 12 ... 99 100 101
を生成します。
١
(アラビア-インド digit 1 (ディジット:2進法の0か1))フォーマットトークンが、シーケンス ?
を生成する場合には、次に ?
次に更に ?
... (と続きます)
フォーマットトークン A
は、は、シーケンス A B C ... Z AA AB AC...
を生成します。
フォーマットトークン a
は、シーケンス a b c ... z aa ab ac...
を生成します。
フォーマットトークン i
は、シーケンス i ii iii iv v vi vii viii ix x ...
を生成します。
フォーマットトークン I
は、シーケンス I II III IV V VI VII VIII IX X ...
を生成します。
フォーマットトークン w
は、小文字語句として書かれる数字を生成します、例えば、英語では、 one two three four ...
フォーマットトークン W
は、大文字語句として書かれる数字を生成します、例えば、英語では、 ONE TWO THREE FOUR ...
フォーマットトークン Ww
は、先頭文字を大文字(title-case)語句として書かれる数字を生成します、例えば、英語では、 One Two Three Four ...
いくつかの他のフォーマットトークンは、数字の1を表現するトークンにおけるシーケンス番号を表示します(但し、以下注記参照)。
上記で列挙した付加的な事項やサポートされる番号付けシーケンスについては、implementation-definedです。
もし、手法が、与えられるトークンによって表現したシーケンス番号付けをサポートしていない場合には、 1
のフォーマットトークンを利用しなければいけません。
注釈:
いくつかの従来の番号付けシーケンスでは、 付加的な合図は、数字として解釈されるべき字句を示すために追加されます;これらは、フォーマットトークンの中に含まれません。 以下の例もまた参照する例は、 dexia keraia と時折、 aristeri keraia が追加される場合には、古代ギリシャ文字です。
上記の最初の種類(十進アラビア数字の構成の1つ)ではなく、すべてのフォーマットトークンにおいては、このフォーマットトークンを利用してフォーマットされる事が可能な数字の範囲に基づく下限と上限は、
implementation-definedとなる場合があります。;
事実、いくつかの番号付けシーケンスにおいては、固有の限界がある場合があります。
例えば、フォーマットトークン
①
(丸付き数字1)は、Unicode文字全範囲によって課される1から20までの範囲を持ちます。
上記のように記述した番号付けシーケンスにおいては、手法によって課されるいくつかの上限(上界)は、1000以下にしてはならず、いくつかの下限(下界)は、1より大きくしてはいけません。
この範囲の外側に置かれた数字は、フォーマットトークン 1
を利用してフォーマットされなければいけません。
フォーマットトークン 1
と結び付いた番号付けシーケンスは、0(ゼロ)という下限を持ちます。
a
と i
のようなフォーマットトークンにおける番号付けシーケンスの上記拡張が示されていますが規定ではありません。
アルファベットを使い果たした際に継続するアルファベット順シーケンス方法における利用にある様々な規約、そしてまた、ローマ数字が書かれる方法(例えば、数字4を表現するものとしての IV
に対する IIII
)における異なる規約があります。
時折、 アルファベット順シーケンスは、 i
と o
のような文字を省略して利用されます。
この仕様は、これらのシーケンスが、いつも十進アラビア数字で構成されるという事ではなく、いくつかのシーケンスの詳細を規定するものではありません。
多くの番号付けシーケンスは、language-sensitive です。
これは、トークン w
、W
、 Ww
によって選択したシーケンスに特に適用します。
それはまた、例えば、文字 #x410 (キリル文字([Cyrillic]:現代ロシア文字の基礎でギリシャ文字をもとに作られた教会スラブ文字)の主要な文字A)を伴って始まるごとに文字の異なるシーケンスを利用するキリル文字のアルファベットを利用する異なる言語など他のシーケンスにも提供します。
このようなケースでは、 lang
属性は、利用される為にある言語の規定を記述します;
それは、 xml:lang
(参照先: [XML 1.0]) としての同じ値の範囲を持ちます。
もし、 存在しない lang
値が記述される場合には、利用されるその言語は、implementation-definedです。
番号付けがサポートされる事における言語のセットは、implementation-definedです。
もし、サポートされない言語が要求される場合には、もし、 lang
属性が省略される場合、プロセッサは、それが利用するであろう言語を利用します。
もし、付加的な ordinal
属性が存在する場合、そしてもし、その値が、ゼロの長さの文字列ではない場合には、これは、基数ではなく、順序を表す数字(序数)である出力要求を表示します。
例えば、英語では、値 ordinal="yes"
は、フォーマットトークン 1
を伴って利用した際にはシーケンス 1st 2nd 3rd 4th ...
を出力し、また、フォーマットトークン w
を伴って利用した際には、シーケンス first second third fourth ...
を出力します。
様々な文法的な文脈に依存するいくつかの言語序数では、例えば、それらは、ジェンダーを持つ場合があり、そしてまた、それらが修飾する名詞を語形変化させる場合があります。
このようなケースでは、 ordinal
属性の値は、要求した序数のバリエーションを示すために利用される場合があります。
バリエーションが示される方法は、言語の規定に依存するでしょう。
様々な語句の末尾を語尾変化した言語においては、 選んだ取り上げ方は、ハイフンによって先行する末尾を示す事です:例えば、ドイツ語では、ふさわしい値は、 -e、 -er、 -es, -en
です。
フォーマットトークン、言語、 ordinal
属性がサポートされる事は、implementation-definedです。
もし、序数番号付けが、フォーマットトークン、言語、 ordinal
属性の実際の値の組合わせの為にサポートされたものではない場合には、要求は無視され、基数が代わりに生成されます。
その記述 format="1" ordinal="-o" lang="it"
をもし、サポートした場合は、シーケンスを生成すべきです:
1o 2o 3o 4o ...
その記述 format="Ww"、または、dinal="-o" lang="it"
をもし、サポートした場合は、シーケンスを生成すべきです:
Primo Secondo Terzo Quarto Quinto ...
letter-value
属性は、文字を利用する番号付けシーケンス間を明確にします。
多くの言語では、文字を利用する一般に利用した番号付けシーケンスには2つあります。
1つは、番号付けシーケンスが、アルファベット順シーケンスにある文字に数値を結びつけ、他方は、その言語において他のいくつかの伝統的なマナーにある文字ごとに数値を結びつけます。
英語では、これらは、フォーマットトークン a
と i
によって記述した番号付けシーケンスと一致するでしょう。
いくつかの言語では、シーケンスごとの最初のメンバは、同じであり、そしてその為、個々のフォーマットトークンは、明確になるでしょう。
alphabetic
の値は、アルファベット順シーケンスを記述し、 traditional
の値は、他のシーケンスを記述します。
もし、 letter-value
属性が、記述されない場合には、どのようにいくつかの明確化が解決されるかについては、implementation-dependentです。
注釈:
手法は、数字がフォーマットされる方法を超える付加的な操作を提供する xsl:number
において拡張属性を利用する場合があります。
grouping-separator
属性は、十進番号付けシーケンスにあるグループ化(例えば、数千[1,000~9,999])セパレータのように利用したセパレータが与えられ、
付加的な grouping-size
は、グループ化するサイズ(通常 3)を記述します。
例えば、 grouping-separator=","
と grouping-size="3"
は、
grouping-separator="."
と grouping-size="2"
が、形式 1.00.00.00
という数字を生成するであろう間、形式 1,000,000
という数字を生成するでしょう。
もし、 grouping-separator
と grouping-size
属性の一方だけが記述される場合には、それは、無視されます。
これらの例は、全てのブラウザで正しく表示できないであろう非ラテン文字を利用し、システム構成に依存します。
説明 | フォーマットトークン | シーケンス |
---|---|---|
フランス語の基数語句 | format="Ww" lang="fr" |
Un, Deux, Trois, Quatre |
ドイツ語の序数語句 | format="w" ordinal="-e" lang="de" |
erste, zweite, dritte, vierte |
カタカナ番号付け | format="ア" |
ア、 イ、 ウ、 エ、 オ、 カ、 キ、 ク、 ケ、 コ、 サ、 シ、 ス、 セ、 ソ、 タ, チ、 ツ、 テ、 ト、 ナ、 ニ、 ヌ、 ネ、 ノ、 ハ、 ヒ、 フ、 ヘ、 ホ、 マ、 ミ、 ム, メ、 モ、 ヤ、 ユ、 ヨ、 ラ、 リ、 ル、 レ、 ロ、 ワ、 ヰ、 ヱ、 ヲ、 ン |
イロハ指定によるカタカナ番号付け | format="イ" |
イ、 ロ、 ハ、 ニ、 ホ、 ヘ、 ト、 チ、 リ、 ヌ、 ル、 ヲ、 ワ、 カ、 ヨ、 タ, レ、 ソ、 ツ、 ネ、 ナ、 ラ、 ム、 ウ、 ヰ、 ノ、 オ、 ク、 ヤ、 マ、 ケ、 フ、 コ, エ、 テ、 ア、 サ、 キ、 ユ、 メ、 ミ、 シ、 ヱ、 ヒ、 モ、 セ、 ス |
タイ語番号付け | format="๑" |
?、 ?、 ?、 ?、 ?、 ?、 ?、 ?、 ?、 ??、 ??、 ??、 ??、 ??, ??、 ??、 ??、 ??、 ??、 ?? |
伝統的なヘブライ語番号付け | format="א" letter-value="traditional" |
?、 ?、 ?、 ?、 ?、 ?、 ?、 ?、 ?、 ?、 ??、 ??、 ??、 ??, ??、 ??、 ??、 ??、 ??、 ? |
伝統的なグルジア語番号付け | format="ა"
letter-value="traditional" |
?、 ?、 ?、 ?、 ?、 ?、 ?、 ?、 ?、 ?、 ??、 ??、 ??、 ??, ??、 ??、 ??、 ??、 ??、 ? |
古代ギリシャ番号付け (参照先:注釈) | format="α" letter-value="traditional" |
α?、 β?、 γ?、 δ?、 ε?、 ??、 ζ?、 η?、 θ?、 ι?、 ια?, ιβ?、 ιγ?、 ιδ?、 ιε?、 ι??、 ιζ?、 ιη?、 ιθ?、 κ? |
古いスラブ語番号付け | format="а" letter-value="traditional" |
А、 В、 Г、 Д、 Е、 ?、 З、 И、 ?、 ?、 А?、 В?、 Г?、 Д?, Е?、 ??、 З?、 И?、 ??、 К |
注釈としては、古代ギリシャ語の例は、フォーマットトークンが、数字の1という表現と同じではない例です。