This transformation has replaced the entire document.
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
Результат: при помощи элемента
<xsl:template>
я установил правило в таблице стилей. Когда процессор XSL считывает документ, первым узлом является корневой узел. Это
правило находит данный корневой узел, и от того процессор XSL копирует литералы в результирующее дерево, что даст нам HTML doc и заменит его документом HTML, генерируя следующий результат:
<HTML>
<HEAD>
<TITLE>
A trivial transformation
</TITLE>
</HEAD>
<BODY>
This transformation has replaced the entire document.
</BODY>
</HTML>
Рассмотренный пример иллюстрирует первое, устаревшее преобразование. Была создана простая таблица стилей с единственным элементом
<xsl:template>
, который содержит только элемент буквального результата. Все, что сделано в примере, — замена всего документа XML на документ HTML, что не очень впечатляет. Далее мы увидим, как работает рекурсивная обработка с использованием элемента
<xsl:apply-templates>
.
Элемент <xsl:apply-templates>
В уже написанном нами основном шаблоне корневой узел искался по выражению "/" и заменялся на элемент буквального вывода. Однако, когда мы ищем корневой узел, обычно нам нужно обработать и всю оставшуюся часть документа, что мы сделаем при помощи элемента
<xsl:apply-templates>
.
В следующем списке перечислены атрибуты этого элемента:
•
select
(необязательный). Набор обрабатываемых узлов. Если атрибут опущен, автоматически обрабатываются все потомки узла. Устанавливается в выражение;
•
mode
(необязательный). Устанавливает режим обработки. К этому узлу применяются правила шаблона с режимом выбора. Принимает значение типа
QName
.
Элемент
<xsl:apply-templates>
может содержать ноль или более элементов
<xsl:sort>
, или ноль или более элементов
<xsl:with-param>
.
В следующем примере шаблон ищет корневой узел и замещает его элементом буквального результата <HTML>:
<?xml version="1.0">
<xsl:stylesheet version="1.0"
xmlns:xsl="http://ww.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<HTML>
</HTML>
</xsl:template>
.
.
.
С другой стороны, мы только нашли корневой узел, а дерево данных planets.xml имеет ряд узлов под корневым узлом:
Для обработки не только одного корневого узла можно использовать
<xsl:apply-templates>
, добавив этот элемент следующим образом:
<?xml version="1.0">
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<HTML>
<xsl:apply-templates/>
</HTML>
</xsl:template>
.
.
.
Этот элемент дает указание процессору XSLT просмотреть все дочерние узлы корневого узла и попытаться найти шаблон, которому эти узлы удовлетворяют. Например, вам может потребоваться заменить все элементы
<PLANET>
на
Planet
. Элементы
<PLANET>
— дочерние узлы элемента
<PLANETS>
, поэтому сначала я добавил новый шаблон для
<PLANETS>
, что говорит процессору о том, что следует продолжать поиск дочерних узлов: