XSLT — страница 47 из 124

При помощи элемента

узлу в результирующем документе присваивается очередной номер. Например, можно перенумеровать абзацы в контракте или строфы в поэме. Можно даже перенумеровать части документа несколькими уровнями, как, например, «Paragraph 3.2.5.1.» и т.п.

Элемент

обладает следующими атрибутами:

• 

level
(необязательный). Определяет, как будут присваиваться последовательные числа. Устанавливается в «single» (один), «multiple» (несколько) или «any» (любой). Значение по умолчанию — «single»;

• 

count
(необязательный). Определяет, какие узлы нужно подсчитывать. Устанавливается в образец;

• 

from
(необязательный). Определяет точку начала отсчета. Устанавливается в образец;

• 

value
(необязательный). Форматируемое число;

• 

format
(необязательный). Определяет формат вывода. Устанавливается в шаблон значений атрибута, возвращающий строку форматирования;

• 

lang
(необязательный). Определяет язык, чьи соглашения следует использовать для нумерации. Устанавливается в код языка, который можно применять в атрибуте
xml:lang
;

• 

letter-value
(необязательный). Позволяет выбрать различные схемы нумерации. устанавливается в «alphabetical» (алфавитная) или «traditional» (обычная);

• 

grouping-separator
(необязательный). Символ для разделения групп разрядов — например, запятая. Устанавливается в шаблон значений атрибутов, возвращающий единственный символ;

• 

grouping-size
(необязательный). Количество разрядов в каждой группе — определяет место применения разделителя групп разрядов. Устанавливается в шаблон значений атрибутов, возвращающий число. 

СОВЕТ ПО НУМЕРАЦИИ

Как можно видеть из этого списка атрибутов, существует весьма много возможных схем нумерации. Операции нумерации могут стать довольно сложными, поэтому есть один прием: если нумерация будет становиться слишком сложной и запутанной, я просто выведу результирующий документ без нумерации и затем воспользуюсь второй таблицей стилей, которая применит нумерацию.

Существует три основных способа нумерации, в зависимости от установки атрибута уровня (

level
): «
single
», «
multiple
» или «
any
». В следующих разделах мы по очереди рассмотрим каждую из этих схем, начав с одноуровневой нумерации, которая установлена по умолчанию.

Одноуровневая нумерация

Одноуровневая нумерация — это простая нумерация, когда перенумеровываются узлы-братья на одном уровне. Этот тип нумерации установлен по умолчанию. В листинге 5.11 при помощи одноуровневой нумерации перенумеровываются планеты в

planets.xml
.

Листинг 5.11. Одноуровневая нумерация

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</code></pre></p><p><pre><code>     The Planets Table</code></pre></p><p><pre><code>

     The Planets Table

NameMassRadiusDay


. 


 .

 .

 .

А вот результат:

</code></pre></p><p><pre><code>   The Planets Table</code></pre></p><p><pre><code>

   The Planets Table

NameMassRadiusDay
1. Mercury.0553 (Earth = 1)1516 miles58.65 days
2. Venus.815 (Earth = 1)3716 miles116.75 days
3. Earth1 (Earth = 1)2107 miles1 days

Этот результат показан на рис. 5.2.

Рис. 5.2. Одноуровневая нумерация элементов 


По умолчанию при нумерации используются числа, но есть и другие возможности. Например, если бы я использовал

, планетам были бы присвоены буквы a, b и с:

</code></pre></p><p><pre><code>   The Planets Table</code></pre></p><p><pre><code>

   The Planets Table

   .

   .

   .

Ниже приведены возможные в атрибуте

format
лексемы и соответствующие им виды нумерации:

• 1 порождает последовательность 1, 2, 3…;

• 01 порождает последовательность 01, 02, 03…;

• другие числа Unicode в других системах счисления порождают последовательности аналогично двум предыдущим правилам;

• а порождает последовательность a, b, с…, аа, ab…;

• А порождает последовательность А, В, С…, АА, АВ…;

• i порождает последовательность i, ii, iii, iv…, ix, x, xi, xii…;

• I порождает последовательность I, II, III, IV…, IX, X, XI, XII…

Нумерация на произвольных уровнях

Иногда может потребоваться просто подсчитать узлы определенного типа независимо от их уровня в документе. Например, в различных местах иерархии документа не исключено наличие нескольких элементов

, и вам может быть нужно просто трактовать документ как поток данных, подсчитывая встречающиеся элементы
.

Вот как примерно это будет выглядеть, если в

planets.xml
элементы
встречаются на различных уровнях:

</b></code></pre></p><p><pre><code><b><NAME>Planets Table</NAME></b></code></pre></p><p><pre><code><b>

Mercury

.0553

58.65

1516

.983

43.4

Venus

.815

116.75

3716

.943

66.8

  .

  .

  .

Чтобы сосчитать общее число элементов

, в таблице стилей можно установить атрибут
level
в «any» (листинг 5.12).

Листинг 5.12. Нумерация на произвольных уровнях

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</code></pre></p><p><pre><code>     The Planets Table</code></pre></p><p><pre><code>

     The Planets Table

NameMassRadiusDay
a. Mercury.0553 (Earth = 1)1516 miles58.65 days
b. Venus.815 (Earth = 1)3716 miles116.75 days

NameMassRadiusDay




. 


 .

 .

 .

Получаем результат (заметьте, что текст каждого элемента , независимо от его уровня в документе, пронумерован):

</code></pre></p><p><pre><code>   The Planets Table</code></pre></p><p><pre><code>

   The Planets Table

  1. Planets Table

NameMassRadiusDay
2. Mercury.0553 (Earth = 1)1516 miles58.65 days
3. Venus.815 (Earth = 1)3716 miles116.75 days
4. Earth1 (Earth = 1)2107 miles1 days

При помощи атрибута

from
можно указать, с какого узла-предка начинать отсчет; например, если установить узел-предок в элемент
так:

то процессор XSLT осуществит обратный просмотр только до первого предка

и начнет нумерацию с этой точки документа.

Многоуровневая нумерация

Элемент

также поддерживает многоуровневую нумерацию — такую как 3.1.2.5 и т. п. Для работы с ней нужно установить атрибут
level
в «multiple». При помощи атрибута
count
можно указать, узлы какого типа вы хотите нумеровать, установив этот атрибут в образец, например: "
PART|CHAPTER|PARAGRAPH
". При обработке элементов
процессор XSLT нумерует узлы в соответствии с иерархией документа.

В примере я нумерую каждый уровень в иерархии элементов

planets.xml
, установив атрибут
count
в «*» для выбора всех элементов. Можно также указать формат нумерации при помощи атрибута
format
. При многоуровневой нумерации атрибут
format
задает формат для различных уровней, например «1.1.1.» задает нумерацию 1., 2., … и т.д. для узлов верхнего уровня, 1.1., 1.2., … и т.д. для узлов уровнем ниже и 1.2.1., 1.2.2., … и т. д. для следующего уровня вниз. Вот как выглядит таблица стилей для этого примера в листинге 5.13.

Листинг 5.13. Многоуровневая нумерация

<хsl:stylesheet version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

Вот результат преобразования planets.xml в новый XML-документ, в котором перенумерованы все уровни элементов в соответствии с иерархией документа:

1.

1.1.

1.1.1. Mercury

1.1.2. .0553

1.1.3. 58.65

1.1.4. 1516

1.1.5. .983

1.1.6. 43.4

1.2.

1.2.1. Venus

1.2.2. .815

1.2.3. 116.75

1.2.4. 3716

1.2.5. .943

1.2.6 66.8

1.3.

1.3.1. Earth

1.3.2. 1

1.3.3. 1

1.3.4. 2107

1.3.5. 1

1.3.6. 128.4

На этом мы завершаем рассмотрение нумерации документов и переходим к последней теме этой главы — расширяемости XSLT.

Расширяемость XSLT