□ Список номеров будет состоять из нуля или более чисел (по одному на каждый уровень нумерации) при использовании метода 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;" (русская строчная буква " а").
Читать дальше