правила. Режимы позволяют задавать различные преобразования для одних и тех же частей документа (о них мы поговорим позже).
Атрибут priority
используется для определения значения, которое называется
Атрибуты шаблонного правила не влияют на выполнение его содержимого. Они используются элементами xsl:apply-templates
и xsl:call-template
при выборе шаблонов. Правила, которые были импортированы в преобразование, вызываются элементом xsl:apply- imports
.
Вызов шаблонных правил
Рассмотрим следующий простой пример.
<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
и создадим преобразование, включающее оба правила.
<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
.
Элемент
Синтаксис этого элемента выглядит следующим образом:
<xsl:apply-templates
select='
mode='
<!-- Содержимое: несколько элементов xsl:sort или xsl:with-param -->
</xsl:apply-templates>
Элемент xsl:apply-templates
применяет шаблонные правила к узлам, которые возвращаются выражением, указанным в атрибуте select
. Если атрибут select
опущен, то xsl:apply-templates
применяет шаблонные правила ко всем дочерним узлам текущего узла, то есть
<xsl:apply-templates/>
равносильно
<xsl:apply-templates select='child::node()'/>
Атрибут mode
используется для указания режима, в котором должны применяться шаблоны — мы поговорим о различных режимах чуть позже.
Прежде чем двигаться дальше, опишем более подробно, что означает 'применить шаблон' (англ. apply — применить, template — шаблон). Применение шаблонов — это составная часть обработки документа, которая может быть описана следующим порядком действий.
□ На первом шаге процессор вычисляет выражение, указанное в атрибуте