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

на главную

Жанры

Технология XSLT

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

Шрифт:

 </xsl:template>

</xsl:stylesheet>

На этот раз вместо ожидаемого результата вида

<b>text</b>
мы получим

 text

Попробуем ответить на три вопроса: кто виноват, что делать и куда делся элемент

b
.

Для ответа на вопрос, куда делся элемент

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

□ Процессор начинает обработку с корневого узла дерева. Он выбирает шаблон, соответствующий этому узлу. В нашем преобразовании такого шаблона нет, значит, процессор применит к корню шаблонное правило, определенное по умолчанию (см. раздел "Встроенные шаблоны" данной главы).

□ По умолчанию шаблонное правило корневого узла обрабатывает все дочерние узлы. В нашем документе единственным дочерним узлом корня будет элемент

para
.

□ Для элемента

para
в нашем преобразовании задан шаблон, который и будет применен к этому элементу.

□ В соответствии с этим шаблоном, процессор создаст элемент

p
и включит в него текстовое значение выражения "
.
". Как мы знаем, выражение "
.
" является сокращенной формой выражения "
self::node
", которое возвратит текущий узел. Таким образом, элемент
<xsl:value-of select="."/>
вычислит и возвратит строковое значение текущего узла, то есть узла
para
. Строковым значением элемента является конкатенация всех его текстовых потомков. Единственным текстовым потомком нашего para является текстовый узел со значением "
text
" и вот он-то и выводится между открывающим и закрывающим тегами созданного элемента
p
.

Таким образом, элемент

b
"потерялся" потому, что шаблон для
bold
просто не вызывался. Виноваты, естественно, мы сами, поскольку не включили его вызов. Осталось только разобраться, как можно вызвать шаблон для обработки элемента
bold
.

Ответ на этот вопрос предельно прост — для вызова неименованных шаблонных правил В XSLT используется элемент

xsl:apply-templates
.

Элемент xsl:apply-templates

Синтаксис этого элемента выглядит следующим образом:

<xsl:apply-templates

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

 mode="режим">

 <!-- Содержимое: несколько элементов xsl:sort или xsl:with-param -->

</xsl:apply-templates>

Элемент

xsl:apply-templates
применяет шаблонные правила к узлам, которые возвращаются выражением, указанным в атрибуте
select
. Если атрибут
select
опущен, то
xsl:apply-templates
применяет шаблонные правила ко всем дочерним узлам текущего узла, то есть

<xsl:apply-templates/>

равносильно

<xsl:apply-templates select="child::node"/>

Атрибут

mode
используется для указания режима, в котором должны применяться шаблоны — мы поговорим о различных режимах чуть позже.

Прежде чем двигаться дальше, опишем более подробно, что означает "применить шаблон" (англ. apply — применить, template — шаблон). Применение шаблонов — это составная часть обработки документа, которая может быть описана следующим порядком действий.

□ На первом шаге процессор вычисляет выражение, указанное в атрибуте

select
. Его значением должно быть множество узлов. Полученное множество узлов упорядочивается и становится текущим списком узлов контекста преобразования.

□ Для каждого из узлов этого списка процессор находит наиболее подходящий шаблон для обработки. Процессор делает этот узел текущим и затем выполняет в измененном контексте выбранное шаблонное правило.

□ Дерево, которое является результатом выполнения шаблона, добавляется в выходящее дерево.

Применительно к нашему примеру с

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

Листинг 5.3. Преобразование с para и bold — версия 2

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:template match="bold">

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

 </xsl:template>

 <xsl:template match="para">

<xsl:apply-templates

 </xsl:template>

</xsl:stylesheet>

Проследим за процессом выполнения этого преобразования.

□ Обработка начинается с корневого узла дерева. Для него нет заданных шаблонных правил, значит, применено будет правило по умолчанию — обработать все дочерние узлы. Множество дочерних узлов корня содержит единственный элемент

para
, значит, текущий список узлов контекста будет состоять из одного узла. Для него в преобразовании определен шаблон, который и будет выполнен процессором.

□ Шаблон, соответствующий элементу

para
, создает элемент
p
, содержимым которого будет результат выполнения инструкции
xsl:apply-templates
, то есть результат применения шаблонов к дочерним узлам текущего узла — элемента
para
.

□ Единственным дочерним узлом элемента

para
является элемент
bold
. Процессор изменит контекст так, что текущий список узлов будет содержать только элемент
bold
и выполнит соответствующее шаблонное правило, которое создаст элемент
b
и включит в него узел, вычисленный инструкцией
<xsl:value-of select="."/>
, то есть текстовый узел со строковым значением текущего узла, элемента
bold
.

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

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Девяностые приближаются

Иванов Дмитрий
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Девяностые приближаются

Жена фаворита королевы. Посмешище двора

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Жена фаворита королевы. Посмешище двора

(не)Бальмануг. Дочь 2

Лашина Полина
8. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(не)Бальмануг. Дочь 2

Буря империи

Сай Ярослав
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Буря империи

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13

Книга пятая: Древний

Злобин Михаил
5. О чем молчат могилы
Фантастика:
фэнтези
городское фэнтези
мистика
7.68
рейтинг книги
Книга пятая: Древний

Зеркало силы

Кас Маркус
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зеркало силы

Имя нам Легион. Том 5

Дорничев Дмитрий
5. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 5

Аномальный наследник. Том 3

Тарс Элиан
2. Аномальный наследник
Фантастика:
фэнтези
7.74
рейтинг книги
Аномальный наследник. Том 3

Архил...? 4

Кожевников Павел
4. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
5.50
рейтинг книги
Архил...? 4

Хозяйка лавандовой долины

Скор Элен
2. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Хозяйка лавандовой долины

Отмороженный 10.0

Гарцевич Евгений Александрович
10. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный 10.0

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2