□ Атрибуты, значениями которых являются выражения.
□ Атрибуты, значениями которых являются паттерны.
□ Атрибуты элементов верхнего уровня.
□ Атрибуты пространств имен (xmlns).
Шаблоны значений могут содержаться в любых атрибутах литеральных элементов, что уже несколько раз было продемонстрировано выше. Например, в литеральном элементе
<img src="{../@dir}/th_{@filename}"/>
атрибут src содержит ни что иное, как два шаблона значений.
Что же касается атрибутов элементов XSLT, то как очевидно из табл. 4.4, лишь малая их часть может содержать шаблоны значений.
Таблица 4.4. Атрибуты элементов XSLT, которые могут содержать шаблоны значений
| Элемент | Атрибуты | Описание |
|---|---|---|
xsclass="underline" element |
name |
Имя создаваемого элемента |
namespace |
Пространство имен создаваемого элемента | |
xsclass="underline" attribute |
name |
Имя создаваемого атрибута |
namespace |
Пространство имен создаваемого атрибута | |
xsclass="underline" processing-instruction |
name |
Имя целевого приложения инструкции по обработке |
xsclass="underline" number |
format |
Формат номера |
lang |
Языковой контекст номера | |
letter-value |
Традиционная или алфавитная буквенная нумерация | |
grouping-separator |
Символ-разделитель групп цифр номера | |
grouping-size |
Размер группы цифр номера | |
xsclass="underline" sort |
lang |
Языковой контекст сортировки |
data-type |
Тип данных сортировки | |
order |
Порядок сортировки | |
case-order |
Старшинство прописных и строчных символов при сортировке |
Таким образом, перечень параметров, которые могут изменяться динамически (иными словами — вычисляться непосредственно во время выполнения шаблона) не так велик. В частности, стандартными способами в XSLT невозможно выполнить следующее.
□ Вызвать именованный шаблон динамически: атрибут name элемента xsclass="underline" call-template должен быть задан заранее и не может содержать шаблон значения.
□ Динамически изменить режим применения шаблонов (атрибут mode элемента xsclass="underline" apply-templates).
□ Вычислить элементами xsclass="underline" copy-of и xsclass="underline" value-of выражение заранее неизвестного вида.
□ Давать переменным и параметрам имена, вычисляемые во время выполнения преобразования.
Список ограничений подобного рода можно продолжать еще долго, однако общим свойством этих ограничений является то, что шаблоны значений атрибутов могут использоваться при формировании выходящего элемента, но они не оказывают никакого влияния на сам ход выполнения преобразования.
Глава 5
Шаблонные правила
Преобразование как набор правил
В предыдущих главах мы уже упомянули о том, что преобразование в XSLT состоит не из последовательности действий, а из набора шаблонных правил, каждое из которых обрабатывает свою часть XML-документа. Эта глава целиком посвящена вопросам создания и использования шаблонных правил, однако, прежде чем мы приступим к их рассмотрению, хотелось бы пояснить, почему же все-таки правила, а не действия.
Дело в том, что структуры XML-документов (даже принадлежащих одной логической схеме) могут быть настолько разнообразны, что создание императивной программы, которая выполняла бы их преобразование, является очень сложной задачей. Возможность включения или исключения тех или иных элементов, наличие или отсутствие атрибутов, да и неопределенность самой структуры документа в конечном итоге приводят к экспоненциальному увеличению количества операторов ветвления, циклов и так далее. Программа становится большой, сложной и малопонятной.
В то же время само преобразование может быть очень простым. Не понимая, что нужно сделать, чтобы преобразовать документ целиком, тем не менее, можно хорошо понимать, как следует обработать каждую из его частей.
Вследствие этого, язык XSLT был создан декларативным: вместо того, чтобы определять последовательность действий, программа в XSLT декларирует правила преобразования. Каждое из этих правил может в свою очередь вызывать другие правила, таким образом обеспечивая обработку документов сколь угодно сложной структуры.
Определение шаблонного правила
Элемент xsclass="underline" template
Синтаксис этого элемента приведен ниже:
<xsclass="underline" template
match="пaттерн"
name="имя"
priority="число"
mode="имя">
<!-- Содержимое: несколько элементов xsclass="underline" param, тело шаблона -->
</xsclass="underline" template>
Элемент верхнего уровня xsclass="underline" template определяет в преобразовании шаблонное правило, или просто шаблон. Элемент xsclass="underline" template имеет всего четыре атрибута, смысл которых мы кратко опишем ниже.
Атрибут match задает паттерн — образец узлов дерева, для преобразования которых следует применять этот шаблон.
<xsclass="underline" template match="bold">
<b><xsclass="underline" value-of select="."/></b>
</xsclass="underline" template>
В этом правиле атрибут match говорит о том, что оно должно использоваться для обработки элементов bold — в данном случае они будут заменяться на элементы b. Шаблоны, в которых определен атрибут match, вызываются при помощи инструкции xsclass="underline" apply-templates.
Шаблон также может иметь имя, определяемое атрибутом name. Шаблон, в котором задано имя, называется именованным шаблоном. Именованные шаблоны могут вызываться вне зависимости от текущего контекста, и даже вести себя как функции — принимать на вход параметры и возвращать некоторые значения.
<xsclass="underline" template name="bold">
<b><xsclass="underline" value-of select="."/></b>