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

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

Жанры

Технология XSLT

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

Шрифт:

<para>paragraph 7</para>

<para>paragraph 8</para>

<para>paragraph 9</para>

</section>

<section title="Forth section">

<para>paragraph 10</para>

<para>paragraph 11</para>

<para>paragraph 12</para>

</section>

<section title="Fifth section">

<para>paragraph 13</para>

<para>paragraph 14</para>

<para>paragraph 15</para>

<para>paragraph 16</para>

</section>

 </chapter>

 <chapter title="Third chapter">

<section title="Sixth section">

<para>paragraph 17</para>

<para>paragraph 18</para>

</section>

 </chapter>

</doc>

В

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

Листинг 8.32. Вариант нумерующего шаблона с использованием xsl:value-of

<xsl:template match="chapter">

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

 <xsl:text>. </xsl:text>

 <xsl:value-of select="@title"/>

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

</xsl:template>

Листинг 8.33. Вариант нумерующего шаблона с использованием xsl:number

<xsl:template match="chapter">

 <xsl:number value="position" format="1. "/>

 <xsl:value-of select="@title"/>

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

</xsl:template>

Результат обоих шаблонов имеет следующий вид:

1. First chapter

2. Second chapter

3. Third chapter

Использование

xsl:number
даже в этом простом случае сэкономило одну строчку в коде. Однако, если бы вместо нумерации арабскими цифрами (
1
,
2
,
3
и т.д.) нужно было применить нумерацию римскими цифрами (
I
,
II
,
III
и т.д.), в преобразовании с
xsl:number
мы бы изменили всего один символ (вместо
format="1. "
указали бы
format="I. "
), в то время как в преобразовании с
xsl:value-of
пришлось бы писать сложную процедуру преобразования числа в римскую запись.

В том случае, если атрибут

value
опущен, номера элементов
вычисляются исходя из значений атрибутов
level
,
count
и
from
.

Атрибут

level
имеет три варианта значений:
single
,
multiple
и
any
, значением по умолчанию является
single
. Процедура вычисления номеров существенным образом зависит от того, какой из этих вариантов используется — при методе
single
считаются элементы на одном уровне, при методе
multiple
— на нескольких уровнях и при методе
any
— на любых уровнях дерева. Алгоритм вычисления списка номеров в каждом из случаев не слишком сложен, но понять его только по формальному описанию довольно непросто. Поэтому каждый из методов будет дополнительно проиллюстрирован примерами вычисления.

Атрибут

count
содержит паттерн, которому должны удовлетворять нумеруемые узлы. Узлы, не соответствующие этому образцу, просто не будут приниматься в расчет. Значением этого атрибута по умолчанию является паттерн, выбирающий узлы с тем же типом и именем, что и у текущего узла (если, конечно, у него есть имя).

Атрибут

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

Метод single

Метод

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

Областью нумерации этого метода будет множество всех потомков ближайшего предка текущего узла, удовлетворяющего паттерну, указанному в атрибуте

from
.

Вычисление номера производится в два шага.

□ На первом шаге находится узел уровня дерева. Узлом уровня будет узел, удовлетворяющий следующим условиям:

 • он является первым (то есть ближайшим к текущему) узлом, принадлежащим оси

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

 • он удовлетворяет паттерну

count
;

 • он принадлежит области подсчета;

 • если такого узла нет, список номеров будет пустым.

□ На втором шаге вычисляется номер узла уровня. Этот номер будет равен

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

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

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

Пример

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

<xsl:template match="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