Книга: Технология 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>
<tr>
<xsl:apply-templates select="month"/>
</tr>
</table>
</xsl:template>
Выполняться он будет в следующем контексте (рис. 3.21):
Рис. 3.21. Контекст шаблона элемента summer
Атрибут select
элемента xsl:apply-templates,
который присутствует в этом шаблоне, вычисляет новое текущее множество: путь выборки month
возвращает все дочерние элементы month
текущего узла. Текущим узлом является элемент summer
, то есть новое текущее множество будет состоять из трех его дочерних элементов month
. Таким образом, процессор будет поочередно выполнять шаблоны в каждом из трех следующих контекстов, показанных на рис. 3.22.
Рис. 3.22. Изменение контекста при выполнении шаблона элемента month
Шаблон, вычисляемый в каждом из этих контекстов, имеет следующий вид:
<xsl:template match="month">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
Элемент xsl:value-of
этого шаблона создает в элементе td
текстовый узел, значение которого равно строковому значению выражения ".
", то есть строковому значению текущего узла, и в каждом случае это будет строковое значение соответствующего элемента month
.
Контекст преобразования позволяет более четко определить такие понятия, как "обработка узла", "применение шаблона к узлу" и так далее. Все эти выражения означают одно: выполнение соответствующего шаблона с данным узлом в качестве текущего.
- Контекст вычисления выражений
- Локальные контексты в C++
- Модель преобразования
- 1.2 Процесс, контекст процесса и потоки
- 6.2. Заработок на контекстной рекламе Google AdSense
- 2.7 Преобразования типов
- Как удалить ненужные команды из контекстного меню?
- Определение контекстно-связанных объектов
- Создание контекстного меню
- Как найти исполнителя, который бесплатно настроит вам контекстную рекламу
- Модификаторы спецификации преобразования, используемые в функции printf( )
- 2.16. Явные и неявные преобразования