Добавление шаблонов Печать
Статьи - XSLT

От преобразования нет никакой пользы, если оно не приводит данные именно к той форме, которая нам нужна. Чтобы это сделать, нужно уметь использовать шаблоны, чему и посвящен данный раздел.

Созданиешаблонов

Большинство таблиц стилей не имеют такой простой формы, какую вы только что видели в предыдущем разделе. Вместо этого они разбиваются на группу шаблонов, каждый из которых применяется к определенному типу данных. Давайте переведем нашу таблицу стилей в эту форму (см. листинг 7).


Листинг 7. Переделанная таблица стилей

 

<xsl:stylesheet

version="1.0"

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

xmlns="http://www.w3.org/TR/xhtml1/strict">

<xsl:template match="/">

<html>

<head>

<title>Recipe</title>

</head>

<body>

<h2><xsl:value-of select="/recipes/recipe/name"/></h2>

<h3>Ingredients:</h3>

<p><xsl:value-of

select="/recipes/recipe/ingredients"/></p>

<h3>Directions:</h3>

<p><xsl:value-of

select="/recipes/recipe/instructions"/></p>

</body>

</html>

</xsl:template>

</xsl:stylesheet>

 

 

Здесь информация не изменилась, за исключением того, что процессор смотрит на таблицу стилей и начинает с шаблона, совпадающего с корневым элементом документа, как указано в атрибуте match. Затем он выводит этот шаблон, включая все значения, так же как и раньше. Если вы выполните сейчас преобразование, то должны увидеть точно такие же результаты, как и в листинге6.

Но это нето, что мы хотим. Мы хотим иметь возможность форматировать ингредиенты и инструкции. Для этого мы можем создать отдельные шаблоны для каждого из этих элементов и включить их в таблицу стилей (см. листинг8).


Листинг 8. Создание дополнительных шаблонов

 

<xsl:stylesheet

version="1.0"

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

xmlns="http://www.w3.org/TR/xhtml1/strict">

 

<xsl:template match="/">

<html>

<head>

<title>Recipe</title>

</head>

<body>

<h2><xsl:value-of select="/recipes/recipe/name"/></h2>

<h3>Ingredients:</h3>

<p><xsl:apply-templates

select="/recipes/recipe/ingredients"/></p>

<h3>Directions:</h3>

<p><xsl:apply-templates

select="/recipes/recipe/instructions"/></p>

</body>

</html>

</xsl:template>

 

<xsl:template match="ingredients">

<h3>INGREDIENTS HERE</h3>

</xsl:template>

<xsl:template match="instructions">

<h3>INSTRUCTIONS HERE</h3>

</xsl:template>

 

</xsl:stylesheet>

 

Обратите внимание, что вместо того, чтобы просто вывести элемент value-of, мы теперь указываем таблице стилей применять соответствующие шаблоны к элементам ingredients и instructions. Затем мы создали отдельные шаблоны для этих элементов, задав их в атрибуте match. Добравшись до элемента apply-templates, процессор выбирает все элементы ingredients в документе. Затем он ищет шаблон для ингредиентов, а, найдя его, выводит этот шаблон. То же самое он делает с элементом instructions. Результат должен быть похож на изображенный на рисунке 3.


Рисунок 3. Применение соответствующих шаблонов к элементам ingredients и instructions
Применение соответствующих шаблонов к элементам ingredients и instructions

Так, это уженемного ближе, хотя бы понятно, что здесь два рецепта, однако вы вряд ли захотите объединять ингредиенты и инструкции для всех рецептов. К счастью, эту проблему можно решить лучшей организацией шаблонов.