Книга: Технология XSLT
Нумерация
Нумерация, несомненно, является одной из самых естественных проблем, решаемых при помощи XSLT. Задача нумерации состоит в том, чтобы, исходя из позиции обрабатываемого узла в дереве документа, вычислить по заданным критериям его порядковый номер. В качестве примера такого рода задачи можно привести вывод номеров частей, разделов и глав книги, указание номеров элементов списка или строк таблицы.
Для вычисления порядковых номеров узлов в дереве в XSLT существует несколько способов. В простых случаях для достижения цели бывает достаточно воспользоваться одним из следующих XPath-выражений.
? Для того чтобы получить порядковый номер текущего узла в обрабатываемом множестве, можно использовать функцию position
. Обратим внимание, что это будет позиция узла в обрабатываемом в данный момент множестве, а не в дереве исходящего документа.
? Функция count(preceding-sibling::*)+1
возвращает порядковый номер текущего элемента среди других элементов его родителя, иначе говоря, среди его братьев. Путь выборки preceding-sibling::*
выбирает множество братских элементов, предшествующих текущему узлу, а функция count
вычисляет их количество. Таким образом, значение count(preceding-sibling::*)+1
будет равно 1
для первого элемента (поскольку ему другие элементы не предшествуют), 2
— для второго (ему предшествует один элемент) и так далее.
? Для того чтобы учитывать при подсчете только определенные элементы, можно переписать предыдущее выражение в чуть более строгом виде. Например, выражение, считающее только элементы chapter
, будет задаваться следующим образом: (preceding-sibling::chapter) +1
.
? Глубина текущего узла от корня дерева может быть вычислена выражением count(ancestor-or-self::node()). Это выражение будет возвращать 1
для корневого узла, 2
для элемента документа и так далее.
Вычислять выражения и выводить вычисленные значения в результирующее дерево следует, как и обычно — при помощи элемента xsl:value-of
.
Пример
<xsl:value-of select="count(preceding-sibling::chapter)+1"/>
В более сложных ситуациях бывает необходимо подсчитывать узлы, находящиеся на разных уровнях вложенности или удовлетворяющие определенным условиям, начинать отсчет с заданной позиции в документе и использовать при вычислении номера сложные выражения. Использование XPath в таких случаях может быть очень неудобным — выражения будут слишком громоздкими и вычислять их придется в несколько этапов.
Другим, несравненно более легким и удобным способом нумерации и индексирования узлов является использование элемента xsl:number
.
- Нумерация страниц
- Нумерация версий WSH
- 10.3.1 Нумерация и подтверждение
- Нумерация элементов массива
- Энумерация содержимого ветви реестра
- Последовательности страниц и нумерация страниц
- Графические средства систематизации и выразительности письма (заголовки, абзацы, нумерация, шрифт, цвет)
- 1.2.4. Нумерация работ и диаграмм
- A12.6. Нумерация строк
- Энумерация потоков
- Нумерация на произвольных уровнях
- 9.3. Автоматическая нумерация и списки