ПримерДовольно часто в практике программирования на XSLT встречается потребность создавать элементы с именами, которые заранее не известны, но могут быть вычислены в ходе выполнения преобразования. Представим себе документ
This text should be marked bold.
в котором атрибут
type
элемента mark-up
указывает на тип элемента разметки, который должен быть использован для данного текстового фрагмента. Для того чтобы получить элемент видаThis text should be marked bold.
можно использовать следующий шаблон:
Таким образом, в качестве имени нового элемента, содержащего текст элемента
mark-up
, будет использовано значение атрибута type
.В одном атрибуте можно использовать несколько выражений — каждое из них должно быть заключено в фигурные скобки.
ПримерПредположим, что мы хотим вывести ссылки на графические изображения в виде иконок. Мы задаем список файлов в виде XML-документа:
Файлы хранятся в каталоге, указанном в атрибуте
dir
элемента images
, а иконки имеют те же имена файлов, что и большие изображения, но с префиксом "th_
". Для получения ссылок на изображения мы можем воспользоваться следующим преобразованием:
<а href="{../@dir}/{@filename}">

Результат будет получен в виде:
<а href="/images/rose.jpg">


Для того чтобы использовать в значении атрибута левые и правые фигурные скобки в качестве простых символов, нужно удваивать их количество, то есть указывать "
{{
" вместо каждой левой и "}}
" вместо каждой правой фигурной скобки соответственно.ПримерЭлемент, определенный как
value="{{{{{{Enter your login here}}}}}}"/>
будет преобразован в выходящем документе к виду
Фигурные скобки нельзя использовать рекурсивно для вычисления внутри выражений. К примеру, в качестве значения атрибута
name
, определенного как
не будет использовано вычисленное значение выражения
/h3/p
. Вместо этого процессор выдаст ошибку.Фигурные скобки могут быть спокойно использованы внутри выражения в литералах — в этом случае они не будут задавать значений атрибутов.
ПримерЭлемент, определенный как
будет преобразован к виду
Шаблоны значений могут быть использованы далеко не везде. К примеру, не могут содержать шаблонов следующие типы атрибутов.
□ Атрибуты, значениями которых являются выражения.
□ Атрибуты, значениями которых являются паттерны.
□ Атрибуты элементов верхнего уровня.
□ Атрибуты пространств имен (
xmlns
).Шаблоны значений могут содержаться в любых атрибутах литеральных элементов, что уже несколько раз было продемонстрировано выше. Например, в литеральном элементе

атрибут
src
содержит ни что иное, как два шаблона значений.Что же касается атрибутов элементов XSLT, то как очевидно из табл. 4.4, лишь малая их часть может содержать шаблоны значений.
Таблица 4.4. Атрибуты элементов XSLT, которые могут содержать шаблоны значений
Элемент Атрибуты Описание xsl:element
name
Имя создаваемого элемента namespace
Пространство имен создаваемого элемента xsl:attribute
name
Имя создаваемого атрибута namespace
Пространство имен создаваемого атрибута xsl:processing-instruction
name
Имя целевого приложения инструкции по обработке xsl:number
format
Формат номера lang
Языковой контекст номера letter-value
Традиционная или алфавитная буквенная нумерация grouping-separator
Символ-разделитель групп цифр номера grouping-size
Размер группы цифр номера xsl:sort
lang
Языковой контекст сортировки data-type
Тип данных сортировки order
Порядок сортировки case-order
Старшинство прописных и строчных символов при сортировке
Таким образом, перечень параметров, которые могут изменяться динамически (иными словами — вычисляться непосредственно во время выполнения шаблона) не так велик. В частности, стандартными способами в XSLT невозможно выполнить следующее.
□ Вызвать именованный шаблон динамически: атрибут name элемента
xsl:call-template
должен быть задан заранее и не может содержать шаблон значения.□ Динамически изменить режим применения шаблонов (атрибут
mode
элемента xsl:apply-templates
).□ Вычислить элементами
xsl:copy-of
и xsl:value-of
выражение заранее неизвестного вида.□ Давать переменным и параметрам имена, вычисляемые во время выполнения преобразования.
Список ограничений подобного рода можно продолжать еще долго, однако общим свойством этих ограничений является то, что шаблоны значений атрибутов могут использоваться при формировании выходящего элемента, но они не оказывают никакого влияния на сам ход выполнения преобразования.
Глава 5Шаблонные правила
Преобразование как набор правил
В предыдущих главах мы уже упомянули о том, что преобразование в XSLT состоит не из последовательности действий, а из набора шаблонных правил, каждое из которых обрабатывает свою часть XML-документа. Эта глава целиком посвящена вопросам создания и использования шаблонных правил, однако, прежде чем мы приступим к их рассмотрению, хотелось бы пояснить, почему же все-таки правила, а не действия.
Дело в том, что структуры XML-документов (даже принадлежащих одной логической схеме) могут быть настолько разнообразны, что создание императивной программы, которая выполняла бы их преобразование, является очень сложной задачей. Возможность включения или исключения тех или иных элементов, наличие или отсутствие атрибутов, да и неопределенность самой структуры документа в конечном итоге приводят к экспоненциальному увеличению количества операторов ветвления, циклов и так далее. Программа становится большой, сложной и малопонятной.
В то же время само преобразование может быть очень простым. Не понимая, что нужно сделать, чтобы преобразовать документ целиком, тем не менее, можно хорошо понимать, как следует обработать каждую из его частей.
Вследствие этого, язык XSLT был создан декларативным: вместо того, чтобы определять последовательность действий, программа в XSLT декларирует правила преобразования. Каждое из этих правил может в свою очередь вызывать другие правила, таким образом обеспечивая обработку документов сколь угодно сложной структуры.