Во многих элементах XSLT в качестве значений атрибутов могут быть указаны специальные шаблоны, называемые шаблонами значений атрибутов (attribute value templates). Замечательное свойство этих шаблонов заключается в том, что вместо простых строковых значений в атрибутах можно использовать результаты вычисления выражений. Выражения в шаблонах значений атрибутов должны быть заключены в фигурные скобки (" {}
"). Если процессор встретит внутри значения атрибута выражение в таких скобках, он должен будет вычислить это выражение и заменить его в атрибуте вместе с фигурными скобками на результат вычисления в строковом виде.
Пример
Довольно часто в практике программирования на 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 невозможно выполнить следующее.
Читать дальше