Мы получили множество узлов, состоящее всего из двух элементов — chapter
и para
вследствие того, что элемент doc
был исключен как не входящий в область подсчета. Выделим множества пересчитываемых узлов, предшествующих нумеруемым элементам (рис. 8.9).
Рис. 8.9. Третий шаг вычисления номера
В этом примере элемент chapter
, так же как и элемент para
, будет иметь номер 2
. Соответственно, результатом выполнения инструкции xsl:number
в этом случае будет строка
2.2.paragraph 14
Метод any
Метод any
используется для того, чтобы вычислить номер узла, основываясь на его позиции среди всех учитываемых узлов элемента.
Областью нумерации этого метода будет множество всех узлов, следующих в порядке просмотра документа за первым предком текущего узла, который удовлетворяет паттерну, указанному в атрибуте from
.
Номер вычисляется как 1
плюс количество узлов области подсчета, удовлетворяющих паттерну count
и предшествующих в порядке просмотра документа текущему узлу.
Пример
В качестве примера применения метода any
вычислим порядковый номер элемента para
среди всех элементов документа, начиная со второй главы. Инструкцию такого рода мы запишем в виде
format=" 1."
level="any"
count="*"
from="chapter[2]"/>
При ее выполнении мы сначала определим область, в которой будут подсчитываться узлы (обведены штрих-пунктирной линией на рис. 8.10).
Рис. 8.10. Определение области подсчета узлов
Следующим шагом выделим подмножество области подсчета, предшествующее в порядке просмотра текущему узлу para
(рис. 8.11).
Рис. 8.11. Первый шаг вычисления номера
Выделенное множество содержит 11 узлов, значит, искомый номер будет равен 12
.
Перед тем, как перейти к рассмотрению способов форматирования номеров, приведем итоговый пример (листинг 8.34), в котором в шаблонах будут использоваться все три метода нумерации.
Листинг 8.34. Шаблон, использующий разные методы нумерации
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"»
Resulting document
==================
level="multiple"
count="chapter|section"/>
format=" a) "
level="any"
count="para"/>
Опишем словесно нумерацию, которая будет применяться в этом преобразовании.
□ Элементы chapter
будут нумероваться в соответствии со своей позицией среди других элементов chapter
того же уровня.
□ Элементы section
будут нумероваться при помощи многоуровневой нумерации — номер будет состоять из номера элемента chapter
и номера самого элемента section
.
□ Элементы para
будут нумероваться исходя из своей позиции среди всех остальных элементов para
вне зависимости от того, на каких уровнях в документе они находятся.
Результатом применения этого преобразования к документу, приведенному в листинге 8.31, будет следующий текст.
Листинг 8.35. Выходящий документ
Resulting document
==================
1. First chapter
1.1 First section
a) paragraph 1
b) paragraph 2
c) paragraph 3
1.2. Second section
d) paragraph 4
e) paragraph 5
2. Second chapter
2.1 Third section
f) paragraph 6
g) paragraph 7
h) paragraph 8
i) paragraph 9
2.2 Forth section
j) paragraph 10
k) paragraph 11
l) paragraph 12
2.3 Fifth section
m) paragraph 13
n) paragraph 14
o) paragraph 15
p) paragraph 16
3. Third chapter
3.1 Sixth section
q) paragraph 17
r) paragraph 18
Возвращаясь немного назад, напомним, что результатом первого этапа выполнения xsl:number
является список номеров, который может быть пустым или содержать одно или несколько чисел. Несложно увидеть, что количество номеров в этом списке будет зависеть от следующих условий.
□ Список номеров будет пустым, если в области нумерации не оказалось нумеруемых узлов.
□ Список номеров будет состоять не более чем из одного числа при использовании методов single
и any
.
Читать дальше