xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Проследим за процессом выполнения этого преобразования.
□ Обработка начинается с корневого узла дерева. Для него нет заданных шаблонных правил, значит, применено будет правило по умолчанию — обработать все дочерние узлы. Множество дочерних узлов корня содержит единственный элемент para, значит, текущий список узлов контекста будет состоять из одного узла. Для него в преобразовании определен шаблон, который и будет выполнен процессором.
□ Шаблон, соответствующий элементу para, создает элемент p, содержимым которого будет результат выполнения инструкции xsl:apply-templates, то есть результат применения шаблонов к дочерним узлам текущего узла — элемента para.
□ Единственным дочерним узлом элемента paraявляется элемент bold. Процессор изменит контекст так, что текущий список узлов будет содержать только элемент boldи выполнит соответствующее шаблонное правило, которое создаст элемент bи включит в него узел, вычисленный инструкцией , то есть текстовый узел со строковым значением текущего узла, элемента bold.
Три шага этого преобразования продемонстрированы на рис. 5.1.
Рис. 5.1. Процесс преобразования
Здесь слева показан текущий список узлов, посередине — дерево документа с выделенным пунктиром текущим узлом, справа — генерируемое выходящее дерево.
Результатом этого преобразования будет документ:
text
Рассмотрим чуть более сложное преобразование документа:
text1
text2
Порядок действий в этом случае будет приблизительно следующим.
□ Первым обрабатывается корневой узел. Процессор применяет шаблоны к дочерним узлам (вернее к одному дочернему узлу — элементу para).
□ Шаблон, обрабатывающий элемент para, создает в выходящем документе элемент p и применяет шаблоны к своим дочерним узлам — на этот раз их два, boldи para.
□ Шаблон, обрабатывающий элемент bold, создает в выходящем документе элемент bи текстовый узел со значением " text1".
□ Шаблон, обрабатывающий элемент para, создает в выходящем дереве узел pи применяет шаблоны к дочерним узлам.
□ Единственным дочерним узлом элемента paraявляется элемент bold.
□ Шаблон, обрабатывающий этот элемент bold, создает в выходящем документе элемент bи текстовый узел со значением " text2".
Процесс преобразования показан на рис. 5.2.
Рис. 5.2. Процесс преобразования
Результатом этого преобразования будет документ:
text1
text2
Атрибут selectэлемента xsl:apply-templatesпозволяет выбирать, к каким именно узлам будет применяться этот шаблон. Значение select— это XPath-выражение, которое должно возвращать множество узлов. В случае, если атрибут selectуказан, шаблоны будут поочередно применяться к каждому из узлов выбранного множества.
Пример
Если при обработке элементов para мы хотим обрабатывать только дочерние элементы boldи никакие другие, шаблон обработки элементов paraбудет записан следующим образом:
Результатом обработки документа
text1
text2
будет теперь
text1
Элемент para, который во входящем документе включен в другой элемент para, не будет обработан по той простой причине, что он не вошел во множество, выбранное XPath-выражением " bold". В то же время, если мы запишем
то результат будет таким же, как и прежде:
text1
text2
Следует хорошо понимать разницу между атрибутом selectэлемента xsl:apply-templatesи атрибутом matchэлемента xsl:template. Атрибут matchсодержит не XPath-выражение, а паттерн XSLT; в отличие от атрибута select в xsl:apply-templatesон не выбирает никакого множества узлов, он используется только для того, чтобы проверить, может ли данный узел обрабатываться этим шаблоном или нет.
Атрибут selectэлемента xsl:apply-templatesнаоборот, содержит не паттерн, а выражение, единственным требованием к которому является то, что оно должно возвращать множество узлов. Например, некорректным будет определение вида
поскольку выражение para+1не может возвратить множество узлов.
Читать дальше