Рис. 8.1. Дерево обрабатываемого документа
В качестве первого примера приведем вычисление номера элементом
На первом шаге нам нужно найти узел уровня дерева. Этим узлом будет первый элемент section
, являющийся предком текущего узла. На рис. 8.2 он обведен пунктиром.
Рис. 8.2. Первый шаг вычисления номера
Номер этого элемента будет равен 1
плюс количество предшествующих ему братских элементов section
. Это множество выделено пунктиром на рис. 8.3.
Рис. 8.3. Второй шаг вычисления номера
Выделенное множество содержит два узла. Таким образом, искомый номер будет равен 3
.
Проведем такой же разбор для определения
В этом случае паттерну, указанному в элементе 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
.
Пример
Для демонстрации вычисления номеров на нескольких уровнях дерева документа проследим за выполнением инструкции
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. Второй шаг вычисления номера
Читать дальше