Пример
Для форматирования номеров в последовательности 1.1.a, 1.1.б, 1.1.в, …, 1.2.аи так далее можно использовать объявление вида:
format="1.х430;"
level="multiple"
count="chapter|section"
from="doc"/>
Представим теперь себе следующую ситуацию: нам нужно начать нумерацию с латинской буквы iдля того, чтобы получить последовательность номеров вида i, j, k, l, mи так далее. Первое, что приходит в голову — это запись вида
Однако вместо требуемой последовательности мы получим последовательность строчных римских цифр: i, ii, iiiи так далее. Иными словами, некоторые форматирующие токены определяют нумерующую последовательность двусмысленно: одним вариантом является алфавитная последовательность, начинающаяся этим токеном, другим — некая традиционная для данного языка (например, последовательность римских цифр для английского).Для того чтобы различать эти последовательности в двусмысленных ситуациях, в xsl:numberсуществует атрибут letter-value. Если его значением является "alphabetic", нумерующая последовательность является алфавитной, значение "traditional"указывает на то, что следует использовать традиционный для данного языка способ. Если атрибут letter-valueопущен, процессор может сам выбирать между алфавитным и традиционным способами нумерации.
При использовании цифровых форматов нумерации (иными словами, токенов вида 1, 01, 001и так далее) цифры в номере можно разделить на группы, получив, например, такие номера как " 2.00.00" из 20000или " 0-0-0-2" из 2. Для этой цели в xsl:numberиспользуется пара атрибутов grouping-separatorи grouping-size.
Атрибут grouping-separatorзадает символ, который следует использовать для разбивки номера на группы цифр, в то время как grouping-sizeуказывает размер группы. Эти атрибуты всегда должны быть вместе — если хотя бы один из них опущен, второй просто игнорируется.
Пример
Элемент xsl:numberвида
format="[00000001]"
grouping-separator="."
grouping-size="2"/>
будет генерировать номера в следующей последовательности:
1→ '[00.00.00.01]'
2→ '[00.00.00.02]'
...
999→ '[00.00.09.99]'
1000→ '[00.00.10.00]'
Пожалуй, следует упомянуть, что в значениях атрибутов format, lang, l etter-value, grouping-sizeи grouping-separatorмогут быть указаны шаблоны значений, иными словами могут использоваться выражения в фигурных скобках. Это может быть полезно, например, для того, чтобы сгенерировать форматирующие токены во время выполнения преобразования.
Пример
В следующем шаблоне формат номера секции зависит от значения атрибута formatее родительского узла:
format="{../@format}-1 "
level="multiple"
count="chapter|section"/>
При обработке входящего документа
нумерация секций будет выглядеть как
I-1 First Section
I-2 Second Section
I-3 Third Section
Если же атрибут formatэлемента chapterбудет иметь значение 1, секции будут пронумерованы в виде
1-1 First Section
1-2 Second Section
1-3 Third Section
Мы уже познакомились с функцией языка XPath string, которая конвертирует свой аргумент в строку. Эта функция может преобразовать в строку и численное значение, но возможности ее при этом сильно ограничены.
К счастью, XSLT предоставляет мощные возможности для форматирования строкового представления чисел при помощи функции format-numberи элемента xsl:decimal-format.
Запись функции имеет следующий вид:
string format-number( number , string , string ?)
Функция format-numberпринимает на вход три параметра. Первым параметром является число, которое необходимо преобразовать в строку, применив при этом форматирование. Вторым параметром является образец, в соответствии с которым будет форматироваться число. Третий параметр указывает название десятичного формата, который следует применять.
Образец форматирования в XSLT определяется точно так же, как в классе DecimalFormatязыка Java. Для того чтобы читателю, не знакомому с Java, не пришлось изучать документацию этого языка, мы приведем полный синтаксис образцов форматирования. Продукции образца форматирования мы будем помечать номерами с префиксом NF, чтобы не путать их с другими продукциями.
Читать дальше