Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

Надо сказать, от атрибута

from
в методе
single
мало пользы. Единственный эффект, который можно от него получить, — это пустой список номеров в случае, если первый узел, принадлежащий оси
ancestor-or-self
и удовлетворяющий паттерну
count
, не будет иметь предка, соответствующего паттерну атрибута
from
.

Пример

Разберем функционирование одноуровневой нумерации в следующем шаблоне:

<xsl:template match="para">

 <xsl:number format=" 1." count="section"/>

 <xsl:number format="1." count="para"/>

 <xsl:value-of select="."/>

 <xsl:text>&#xA;</xsl:text>

</xsl:template>

Мы

продемонстрируем вычисление номера одного из элементов
para
на схематическом изображении дерева обрабатываемого документа (рис. 8.1). Узел обрабатываемого элемента мы выделим полужирной линией, узел элемента
doc
пометим буквой
d
, узлы элементов
chapter
— буквой
с
, элементов
section
и para — буквами
s
и
p
соответственно.

Рис. 8.1. Дерево обрабатываемого документа

В качестве первого примера приведем вычисление номера элементом

<xsl:number format=" 1." count="section"/>

На первом шаге нам нужно найти узел уровня дерева. Этим узлом будет первый элемент

section
, являющийся предком текущего узла. На рис. 8.2 он обведен пунктиром.

Рис. 8.2. Первый шаг вычисления номера

Номер этого элемента будет равен

1
плюс количество предшествующих ему братских элементов
section
. Это множество выделено пунктиром на рис. 8.3.

Рис. 8.3. Второй шаг вычисления номера

Выделенное множество содержит два узла. Таким образом, искомый номер будет равен

3
.

Проведем такой же разбор для определения

<xsl:number format="1." count="para"/>

В этом случае паттерну, указанному в элементе

count
удовлетворяет сам текущий узел, значит, он и будет являться узлом уровня, как это показано на рис. 8.4.

Рис. 8.4. Первый шаг вычисления номера

Выделим множество элементов

para
, являющихся братьями узла уровня и предшествующих ему (рис. 8.5).

Рис. 8.5. Второй шаг вычисления номера

Выделенное множество содержит всего один узел, значит, искомый номер будет равен

2
.

Таким образом, результатом обработки выделенного элемента

para
будет следующая строка:

3.2.paragraph 14

Метод multiple

Метод

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

Область нумерации метода

multiple
определяется так же, как
и в случае с методом
single
: учитываются только потомки ближайшего предка текущего узла, удовлетворяющего паттерну, указанному в атрибуте
from
.

Вычисление списка номеров узлов выполняется в два этапа:

□ На первом этапе выбирается множество нумеруемых узлов, удовлетворяющее следующим условиям:

 • его узлы принадлежат оси навигации

ancestor-or-self
текущего узла;

 • его узлы соответствуют паттерну

count
;

 • его узлы принадлежат области подсчета.

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

1
плюс количество узлов, принадлежащих его оси навигации
preceding-sibling
и соответствующих паттерну
count
.

Пример

Для демонстрации вычисления номеров на нескольких уровнях дерева документа проследим за выполнением инструкции

<xsl:number

 format=" 1.1."

 level="multiple"

 count="doc|chapter|para"

 from="doc"/>

при обработке того же элемента

para
.

Прежде всего, надо определить область подсчета. Значением атрибута

from
является паттерн
doc
, значит, подсчет будет вестись среди всех потомков ближайшего к текущему элементу
para
предка, который является элементом
doc
. Это множество выделено на рис. 8.6 штрих-пунктирной линией.

Рис. 8.6. Определение области подсчета

Следующим шагом выберем узлы, принадлежащие оси навигации

ancestor-or-self
текущего узла para и удовлетворяющие паттерну
doc|chapter|para
. Это множество будет включать сам текущий элемент, а также его предки
chapter
и
doc
. На рис. 8.7 они обведены пунктиром.

Рис. 8.7. Первый шаг вычисления номера

Следующим шагом оставим только те из выбранных узлов, которые входят в область подсчета. Эти узлы обведены на рис. 8.8 пунктиром.

Рис. 8.8. Второй шаг вычисления номера

Мы получили множество узлов, состоящее всего из двух элементов —

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

Рис. 8.9. Третий шаг вычисления номера

В этом примере элемент

chapter
, так же как и элемент
para
, будет иметь номер
2
. Соответственно, результатом выполнения инструкции
xsl:number
в этом случае будет строка

2.2.paragraph 14

Метод any

Метод

any
используется для того, чтобы вычислить номер узла, основываясь на его позиции среди всех учитываемых узлов элемента.

Поделиться с друзьями: