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

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

Жанры

Технология XSLT

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

Шрифт:

 <element name="value"

context-position="2" context-size="3" string-value="E"/>

 <element name="value"

context-position="3" context-size="3" string-value="F"/>

 </element>

</element>

Модель преобразования

Во вводной главе мы говорили, что преобразования в XSLT являются наборами шаблонных правил, каждое из которых обрабатывает определенный фрагмент

входящего документа с тем, чтобы сгенерировать фрагмент выходящего документа.

Контекст преобразования

При выполнении преобразования каждая из его инструкций, каждый из элементов обрабатывается в некотором контексте. Контекст преобразования состоит из двух частей: из текущего множества узлов и из текущего узла, которые показывают, что именно обрабатывается в данный момент. XSLT-процессор поочередно обрабатывает каждый из узлов текущего множества (при этом делая этот узел текущим узлом) и объединяет результаты в одно дерево.

Контекст преобразования тесно связан с контекстом вычисления выражений:

□ текущий узел контекста преобразования соответствует контекстному узлу вычисления выражений;

□ позиция текущего узла в текущем обрабатываемом множестве соответствует позиции контекста вычисления выражений;

□ размер текущего множества узлов соответствует размеру контекста вычисления выражений.

Контекст преобразования может изменяться только двумя элементами —

xsl:apply-templates
и
xsl:for-each
. Каждый из этих элементов вычисляет множество узлов, которое становится текущим и затем обрабатывается. После этого контекст преобразования восстанавливается до того состояния, каким он был перед обработкой.

Изменения контекста могут быть продемонстрированы на следующем примере.

Листинг 3.29. Входящий документ

<summer>

 <month>June</month>

 <month>July</month>

 <month>August</month>

</summer>

Этому документу соответствует следующее дерево (рис. 3.19):

Рис. 3.19. Дерево входящего документа

Листинг 3.30. Преобразование

<xsl:stylesheet

 version="1.0"

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

 <xsl:template match="/">

<html>

<head>

<title>Summer</title>

</head>

<body>

<xsl:apply-templates select="summer"/>

</body>

</html>

 </xsl:template>

 <xsl:template match="summer">

<table>

<tr>

<xsl:apply-templates select="month"/>

</tr>

</table>

 </xsl:template>

 <xsl:template match="month">

<td>

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

</td>

 </xsl:template>

</xsl:stylesheet>

Забегая

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

В нашем случае шаблонное правило, обрабатывающее корневой узел, выглядит как:

<xsl:template match="/">

 <html>

<head>

<title>Summer</title>

</head>

<body>

<xsl:apply-templates select="summer"/>

</body>

 </html>

</xsl:template>

Тело этого шаблона выполняется в том самом изначальном контексте, о котором мы только что упомянули: текущее множество состоит из корневого узла, он же является и текущим узлом. Мы можем показать контекст, выделяя текущее множество, пунктиром, а текущий узел — полужирной линией (рис. 3.20).

Рис. 3.20. Первоначальный контекст преобразования

Атрибут

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

При выполнении элемента

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

<xsl:apply-templates select="summer"/>

сведется к выполнению шаблона, обрабатывающего элемент

summer
. Этот шаблон выглядит следующим образом:

<xsl:template match="summer">

 <table>

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

Дорогой Солнца

Котов Сергей
1. Дорогой Солнца
Фантастика:
боевая фантастика
постапокалипсис
5.00
рейтинг книги
Дорогой Солнца

Затерянные земли или Великий Поход

Михайлов Дем Алексеевич
8. Господство клана Неспящих
Фантастика:
фэнтези
рпг
7.89
рейтинг книги
Затерянные земли или Великий Поход

Гарем на шагоходе. Том 1

Гремлинов Гриша
1. Волк и его волчицы
Фантастика:
боевая фантастика
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Гарем на шагоходе. Том 1

Хозяйка расцветающего поместья

Шнейдер Наталья
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Хозяйка расцветающего поместья

Инвестиго, из медика в маги. Том 6. Финал

Рэд Илья
6. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги. Том 6. Финал

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Наследник павшего дома. Том III

Вайс Александр
3. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том III

Мужчина не моей мечты

Ардова Алиса
1. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.30
рейтинг книги
Мужчина не моей мечты

Хроники сыска (сборник)

Свечин Николай
3. Сыщик Его Величества
Детективы:
исторические детективы
8.85
рейтинг книги
Хроники сыска (сборник)

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Повелитель механического легиона. Том III

Лисицин Евгений
3. Повелитель механического легиона
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Повелитель механического легиона. Том III

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

Развод, который ты запомнишь

Рид Тала
1. Развод
Любовные романы:
остросюжетные любовные романы
короткие любовные романы
5.00
рейтинг книги
Развод, который ты запомнишь

Санек 3

Седой Василий
3. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 3