Книга: Технология XSLT
Вызов шаблонных правил
Разделы на этой странице:
Рассмотрим следующий простой пример.
Листинг 5.1. Входящий документ
<para><bold>text</bold></para>
Попробуем написать пару шаблонов, которые будут изменять имена элементов para
и bold
на pи b соответственно. Сначала напишем преобразование для bold
:
<xsl:template match="bold">
<b><xsl:value-of select="."/></b>
</xsl:template>
В этом правиле создается элемент b, в который включается текстовое значение текущего узла (то есть, обрабатываемого элемента bold
). Применив это преобразование к входящему документу, мы получим следующий результат:
<b>text</b>
Как говорят математики, что и требовалось. Попробуем проделать тот же трюк с элементом para
и создадим преобразование, включающее оба правила.
Листинг 5.2. Преобразование с para и bold — версия 1
<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">
<p><xsl:value-of select="."/></p>
</xsl:template>
</xsl:stylesheet>
На этот раз вместо ожидаемого результата вида <p><b>text</b></p>
мы получим
<p>
text
</p>
Попробуем ответить на три вопроса: кто виноват, что делать и куда делся элемент b.
Для ответа на вопрос, куда делся элемент b, пожалуй, необходимо будет пояснить, что же именно происходит при преобразовании этого документа. Последовательно рассмотрим стадии этого процесса.
? Процессор начинает обработку с корневого узла дерева. Он выбирает шаблон, соответствующий этому узлу. В нашем преобразовании такого шаблона нет, значит, процессор применит к корню шаблонное правило, определенное по умолчанию (см. раздел "Встроенные шаблоны" данной главы).
? По умолчанию шаблонное правило корневого узла обрабатывает все дочерние узлы. В нашем документе единственным дочерним узлом корня будет элемент para
.
? Для элемента para
в нашем преобразовании задан шаблон, который и будет применен к этому элементу.
? В соответствии с этим шаблоном, процессор создаст элемент p и включит в него текстовое значение выражения ".
". Как мы знаем, выражение ".
" является сокращенной формой выражения "self::node()
", которое возвратит текущий узел. Таким образом, элемент <xsl:value-of select="."/>
вычислит и возвратит строковое значение текущего узла, то есть узла para
. Строковым значением элемента является конкатенация всех его текстовых потомков. Единственным текстовым потомком нашего para является текстовый узел со значением "text
" и вот он-то и выводится между открывающим и закрывающим тегами созданного элемента p.
Таким образом, элемент b "потерялся" потому, что шаблон для bold
просто не вызывался. Виноваты, естественно, мы сами, поскольку не включили его вызов. Осталось только разобраться, как можно вызвать шаблон для обработки элемента bold
.
Ответ на этот вопрос предельно прост — для вызова неименованных шаблонных правил В XSLT используется элемент xsl:apply-templates
.
- Глава 5 Шаблонные правила
- Правила творческой лени
- Правильная стратегическая последовательность
- Как правильно раздавать и аннулировать права
- Часы в Windows показывают неправильное время
- 1.3. Правила подключения к компьютеру внешних устройств
- Вызов хранимых процедур InterBase с использованием стандартного синтаксиса ODBC
- Как я нашла «правильных» потребителей, когда искала «неправильных»
- Системные вызовы и драйверы устройств
- Правила именования файлов
- 3. Null-значения и общее правило вычисления выражений
- 2. Правила вывода Армстронга