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

на главную - закладки

Жанры

Технология XSLT

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

Шрифт:

□ Для того чтобы учитывать при подсчете только определенные элементы, можно переписать предыдущее выражение в чуть более строгом виде. Например, выражение, считающее только элементы

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
.

Элемент xsl:number

Синтаксис элемента описывается следующей конструкцией:

<xsl:number

 level="single"

| "multiple"

| "any"

 count="паттерн"

 from="паттерн"

 value="выражение"

 format="{строка}"

 lang="{токен}"

 letter-value={ "alphabetic"

| "traditional" }

 grouping-separator="{символ}"

 grouping-size="{число}"/>

Элемент

xsl:number
вычисляет номер узла в соответствии с заданными критериями, форматирует его и затем вставляет в результирующее дерево в виде текстового узла. То, что все это выполняется в одном элементе преобразования, имеет существенные преимущества по сравнению с использованием XPath-выражений: программа становится более простой и понятной, причем далеко не в ущерб функциональности.

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

xsl:number
имеет всего девять атрибутов (причем ни один из них не является обязательным), мы посвятим их описанию значительное количество страниц. Пока же, чтобы сориентировать читателя, мы кратко перечислим назначения атрибутов
xsl:number
.

□ Атрибут

level
указывает, на каких уровнях дерева следует искать нумеруемые узлы.

□ Атрибут

count
указывает, какие именно узлы следует считать при вычислении номера.

□ Атрибут

from
указывает, в какой части документа будет производиться
нумерация.

□ Атрибут

value
задает выражения, которые следует использовать для вычисления значения номера.

□ Атрибут

format
определяет, как номер будет форматироваться в строку.

□ Атрибут

lang
задает языковой контекст нумерации.

□ Атрибут

letter-value
определяет параметры буквенных методов нумерации.

□ Атрибут

grouping-separator
задает символ, разделяющий группы цифр в номере.

□ Атрибут

grouping-size
определяет количество цифр в одной группе.

Выполнение элемента

xsl:number
можно условно разделить на два этапа — вычисление номера и его строковое форматирование. На этапе вычисления активными являются элементы
level
,
count
,
from
и
value
. Форматирование производится с учетом значений атрибутов
format
,
lang
,
letter-value
,
grouping-separator
и
grouping-size
. Результатом первого этапа является список номеров, который форматируется в текстовый узел на втором этапе.

Вычисление номеров

Пожалуй, самым простым для понимания (но не самым простым в использовании) способом вычисления номера является использование XPath-выражений. Этот способ практически идентичен использованию

xsl:value-of
, как было показано в начале этой главы. Единственным отличием
xsl:number
является то, что после вычисления номера он сначала форматируется, а потом уже вставляется в результирующее дерево в виде текстового узла.

Результатом первого этапа форматирования при определенном атрибуте

value
является список, состоящий из числа, полученного в результате вычисления выражения, указанного в значении этого атрибута.

Пример

В этом и нескольких следующих примерах мы будем вычислять номера в одном и том же документе, который представлен в листинге 8.31.

Листинг 8.31. Входящий документ для примеров преобразований с использованием xsl:number

<doc>

 <chapter title="First chapter">

<section title="First section">

<para>paragraph 1</para>

<para>paragraph 2</para>

<para>paragraph 3</para>

</section>

<section title="Second section">

<para>paragraph 4</para>

<para>paragraph 5</para>

</section>

 </chapter>

 <chapter title="Second chapter">

<section title="Third section">

<para>paragraph 6</para>

Поделиться:
Популярные книги

Последнее желание

Сапковский Анджей
1. Ведьмак
Фантастика:
фэнтези
9.43
рейтинг книги
Последнее желание

Ученичество. Книга 2

Понарошку Евгений
2. Государственный маг
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ученичество. Книга 2

Адвокат Империи 7

Карелин Сергей Витальевич
7. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 7

Вонгозеро

Вагнер Яна
1. Вонгозеро
Детективы:
триллеры
9.19
рейтинг книги
Вонгозеро

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7

Неудержимый. Книга IX

Боярский Андрей
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IX

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Возвышение Меркурия. Книга 7

Кронос Александр
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 7

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2

И вспыхнет пламя

Коллинз Сьюзен
2. Голодные игры
Фантастика:
социально-философская фантастика
боевая фантастика
9.44
рейтинг книги
И вспыхнет пламя

Кодекс Крови. Книга I

Борзых М.
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга I

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10