область подсчета. Выделим множества пересчитываемых узлов, предшествующих нумеруемым элементам (рис. 8.9).

Рис. 8.9. Третий шаг вычисления номера
В этом примере элемент chapter
, так же как и элемент para
, будет иметь номер 2
. Соответственно, результатом выполнения инструкции xsl:number
в этом случае будет строка
2.2.paragraph 14
Метод any
используется для того, чтобы вычислить номер узла, основываясь на его позиции среди всех учитываемых узлов элемента.
Областью нумерации этого метода будет множество всех узлов, следующих в порядке просмотра документа за первым предком текущего узла, который удовлетворяет паттерну, указанному в атрибуте from
.
Номер вычисляется как 1
плюс количество узлов области подсчета, удовлетворяющих паттерну count
и предшествующих в порядке просмотра документа текущему узлу.
В качестве примера применения метода any
вычислим порядковый номер элемента para
среди всех элементов документа, начиная со второй главы. Инструкцию такого рода мы запишем в виде
<xsl:number
format=' 1.'
level='any'
count='*'
from='chapter[2]'/>
При ее выполнении мы сначала определим область, в которой будут подсчитываться узлы (обведены штрих-пунктирной линией на рис. 8.10).

Рис. 8.10. Определение области подсчета узлов
Следующим шагом выделим подмножество области подсчета, предшествующее в порядке просмотра текущему узлу para
(рис. 8.11).

Рис. 8.11. Первый шаг вычисления номера
Выделенное множество содержит 11 узлов, значит, искомый номер будет равен 12
.
Перед тем, как перейти к рассмотрению способов форматирования номеров, приведем итоговый пример (листинг 8.34), в котором в шаблонах будут использоваться все три метода нумерации.
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'»
<xsl:template match='doc'>
<xsl:text>Resulting document
</xsl:text>
<xsl:text>==================
</xsl:text>
<xsl:apply-templates select='chapter'/>
</xsl:template>
<xsl:template match='chapter'>
<xsl:number format='1. '/>
<xsl:value-of select='@title'/>
<xsl:text>
</xsl:text>
<xsl:apply-templates select='section'/>
</xsl:template>
<xsl:template match='section'>
<xsl:number format=' 1.1 '
level='multiple'
count='chapter|section'/>
<xsl:value-of select='@title'/>
<xsl:text>
</xsl:text>
<xsl:apply-templates select='para'/>
</xsl:template>
<xsl:template match='para'>
<xsl:number
format=' a) '
level='any'
count='para'/>
<xsl:value-of select='.'/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Опишем словесно нумерацию, которая будет применяться в этом преобразовании.
□ Элементы chapter
будут нумероваться в соответствии со своей позицией среди других элементов chapter
того же уровня.
□ Элементы section
будут нумероваться при помощи многоуровневой нумерации — номер будет состоять из номера элемента chapter
и номера самого элемента section
.
□ Элементы para
будут нумероваться исходя из своей позиции среди всех остальных элементов para
вне зависимости от того, на каких уровнях в документе они находятся.
Результатом применения этого преобразования к документу, приведенному в листинге 8.31, будет следующий текст.
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