Валиков Алексей Н.
Шрифт:
Таблица 8.3. Форматирующие токены
Токен | Описание | Примеры | |
---|---|---|---|
Токен | Преобразование | ||
1 | Форматирует номер в виде строкового представления десятичного числа | 1 | 1 → '1' |
1 | 2 → '2' | ||
1 | 10 → '10' | ||
1 | 999 → '999' | ||
1 | 1000 → '1000' | ||
0...01 | Форматирует номер в виде строкового представления десятичного числа; если получившая строка короче токена, она дополняется предшествующими нулями | 0001 | 1 → '0001' |
001 | 2 → '002' | ||
001 | 10 → '010' | ||
01 | 999 → '999' | ||
00001 | 1000 → '01000' | ||
A | Форматирует номер в виде последовательности заглавных букв латинского алфавита | A | 1 → 'A' |
A | 2 → 'B' | ||
A | 10 → 'J' | ||
A | 27 → 'AA' | ||
A | 999 → 'ALK' | ||
A | 1000 → 'ALL' | ||
a | Форматирует номер в виде последовательности строчных букв латинского алфавита | a | 1 → 'a' |
a | 2 → 'b' | ||
a | 10 → 'j' | ||
a | 27 → 'aa' | ||
a | 999 → 'alk' | ||
a | 1000 → 'all' | ||
I | Форматирует номер заглавными римскими цифрами | I | 1 → 'I' |
I | 2 → 'II' | ||
I | 10 → 'X' | ||
I | 27 → 'XXVII' | ||
I | 999 → 'IM' | ||
I | 1000 → 'M' | ||
i | Форматирует номер строчными римскими цифрами | i | 1 → 'i' |
i | 2 → 'ii' | ||
i | 10 → 'x' | ||
i | 27 → 'xxvii' | ||
i | 999 → 'im' | ||
i | 1000 → 'm' | ||
Другой | Форматирует номер k как k – й член последовательности, начинающейся этим токеном. Если нумерация таким токеном не поддерживается, вместо него используется токен 1 . | Не поддерживающийся токен | 1 → '1' |
b | 10 → 'k' | ||
Б | 2 → 'В' | ||
Б | 27 → 'Ы' | ||
á | 999 → 'ανψ' | ||
å | 1000 → 'βζο' |
При использовании алфавитной нумерации процессор может учитывать значение атрибута
lang
элемента xsl:number
для того, чтобы использовать буквы алфавита соответствующего языка. Однако на практике возможность эта поддерживается очень слабо: большинство процессоров поддерживают алфавитную нумерацию только с использованием латиницы. Поэтому для того, чтобы использовать при алфавитной нумерации кириллицу, вместо атрибута lang
следует использовать форматирующие токены "А
" (русская заглавная буква "А
") и "&#х430;
" (русская строчная буква "а
"). Пример
Для форматирования номеров в последовательности
1.1.a
, 1.1.б
, 1.1.в
, …, 1.2.а
и так далее можно использовать объявление вида: <xsl:number
format="1.&#х430;"
level="multiple"
count="chapter|section"
from="doc"/>
Представим теперь себе следующую ситуацию: нам нужно начать нумерацию с латинской буквы
i
для того, чтобы получить последовательность номеров вида i
, j
, k
, l
, m
и так далее. Первое, что приходит в голову — это запись вида <xsl:number format="i" ... />
Однако вместо требуемой последовательности мы получим последовательность строчных римских цифр:
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
вида <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
, letter-value
, grouping-size
и grouping-separator
могут быть указаны шаблоны значений, иными словами могут использоваться выражения в фигурных скобках. Это может быть полезно, например, для того, чтобы сгенерировать форматирующие токены во время выполнения преобразования. Пример
В следующем шаблоне формат номера секции зависит от значения атрибута
format
ее родительского узла: <xsl:template match="section">
<xsl:number
format="{../@format}-1 "
level="multiple"
count="chapter|section"/>
<xsl:value-of select="@title"/>
</xsl:template>
При обработке входящего документа
<doc>