□ Список номеров будет состоять из нуля или более чисел (по одному на каждый уровень нумерации) при использовании метода multiple
.
На этапе форматирования список номеров преобразуется в строку и вставляется результирующее дерево в виде текстового узла.
Преобразование номеров из списка в строку имеет совершенно иной характер, нежели чем приведение числа к строковому типу. При форматировании номера нужно получить не просто строковое представление числа, здесь требуется сгенерировать значащий текстовый индекс, который совершенно необязательно должен иметь цифровую запись.
Форматирование списка номеров производится в соответствии со значениями атрибутов format
, lang
, letter-value
, grouping-separator
и grouping-size
, назначение и использование которых мы и будем разбирать в этом разделе.
Основным атрибутом форматирования является атрибут format
, который содержит последовательность форматирующих токенов. Каждый форматирующий токен состоит из букв и цифр; он определяет процедуру форматирования для каждого числа из списка форматируемых номеров. В значении атрибута format
форматирующие токены отделяются друг от друга сочетаниями символов, которые не являются буквами и цифрами. Такие сочетания называются разделяющими последовательностями. При форматировании они остаются в строковом выражении номера без изменений.
Пример
В примере к методу multiple
мы использовали следующий элемент xsl:number
:
format=" 1.1."
level="multiple"
count="doc|chapter|para"
from="doc"/>
Разберем строение атрибута format
этого элемента (на рис. 8.12 пробелы обозначены символами " □
"):
Рис. 8.12. Строение атрибута format
элемента xsl:number
Список номеров в том примере состоял из номера элемента chapter
(числа 2) и номера элемента para
(тоже 2). Номер, генерируемый элементом xsl:number
, будет состоять из:
□ разделяющей последовательности " □□□□□
", которая будет скопирована, как есть;
□ числа 2
, которое получается в результате форматирования номера 2 форматирующим токеном " 1
";
□ разделяющего символа " .
";
□ числа 2
, которое получается в результате форматирования номера 2 вторым форматирующим токеном " 1
";
□ разделяющего символа " .
".
Объединив все эти части, мы получим отформатированный номер " □□□□□2.2
".
Несложно заметить, что главную роль при преобразовании списка номеров в их строковое представление играют форматирующие токены. Каждый такой токен преобразовывает соответствующий ему номер в строку. В табл. 8.3 мы приведем описания этих преобразований.
Таблица 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;
" (русская строчная буква " а
").
Читать дальше