Глава 8
Дополнительные элементы и функции языка XSLT
Дополнительные элементы и функции
В этой главе разбираются дополнительные элементы и функции языка XSLT, которые выполняют в преобразованиях различные задачи, непосредственно не связанные с созданием узлов выходящего документа. Дополнительные элементы и функции XSLT расширяют возможности преобразования, предоставляя разного рода вспомогательный сервис.
К дополнительным элементам XSLT мы отнесем следующие:
□ xsl:preserve-space
и xsl:strip-space
— работа с пробельными символами;
□ xsl:message
— сообщения процессора;
□ xsl:sort
— сортировка множеств перед обработкой;
□ xsl:namespace-alias
— определение псевдонимов пространств имен;
□ xsl:key
— определение ключей;
□ xsl:number
— нумерация;
□ xsl:decimal-format
— определение десятичного формата;
□ xsl:output
— контроль сериализации.
В XSLT также определяются дополнительные функции, расширяющие базовую библиотеку функций XPath:
□ key
— использование ключей;
□ format-number
— форматирование чисел;
□ document
— обращение к внешним документам;
□ current
— обращение к текущему узлу преобразования;
□ unparsed-entity-uri
— получение URI неразбираемой сущности по ее имени;
□ generate-id
— генерация уникального идентификатора узла документа;
□ system-property
— получение информации о свойствах системы, окружения.
Обработка пробельных символов
В XSLT выделяются четыре пробельных символа, обработка которых несколько отличается от обработки других символов. Их Unicode-коды и описания сведены в табл. 8.1.
Таблица 8.1. Unicode-коды пробельных символов
Unicode-коды |
Описание |
Десятичный |
Шестнадцатеричный |
|
#9 |
#x9 |
Горизонтальная табуляция |
#10 |
#xA |
Перевод строки |
#13 |
#xD |
Возврат каретки |
#32 |
#x20 |
Пробел |
Отличие обработки пробельных символов заключается в том, что после разбора и создания логической модели для входящего документа и для самого преобразования, узлы, которые содержат только пробельные символы, будут удалены из дерева.
Пример
Рассмотрим шаблон преобразования, содержащий пробельные символы (" □
" обозначает пробел, а " ¶
" — перевод строки).
Листинг 8.1. Шаблон преобразования с пробельными символами
¶
¶
□□□¶
□□□¶
□□□□□□□□□¶
□□□□□□¶
□□□□□□□□□¶
¶
Поскольку текстовые узлы этого шаблона содержат только пробельные символы, они будут удалены из дерева преобразования, и результат будет иметь вид:
Вообще, текстовый узел будет сохранен при выполнении хотя бы одного из следующих условий.
□ Он содержит хотя бы один непробельный символ.
□ Он принадлежит элементу, в котором сохранение пробельных символов задано средствами XML, а именно атрибутом xml:space
со значением preserve
.
□ Он принадлежит элементу, имя которого включено во множество имен элементов, для которых нужно сохранять пробельные символы.
Во всех остальных случаях текстовый узел будет удален.
Продемонстрируем все три случая сохранения текстового узла на примерах.
Первый случай довольно прост. Шаблон
¶
¶
□□¶
¶
создаст в выходящем документе фрагмент
<���а/>
безо всяких пробельных символов, в то время как шаблон
¶
¶
□□||¶
¶
создаст фрагмент вида
¶
¶
□□||¶
¶
Различие двух этих шаблонов в том, что в первом текстовые узлы содержат текст " ¶ ¶ □□
" и " ¶ ¶
" соответственно, а во втором — " ¶ ¶ □□|
" и " | ¶ ¶
". Текстовые узлы второго шаблона не будут удалены, поскольку они содержат непробельные символы (символы " |
").
Второй случай сохранения текстовых узлов основан на использовании возможностей XML по управлению пробельными символами. Если в элементе задан атрибут xml:space
со значением "preserve"
, обрабатывающее программное обеспечение должно сохранять в нем и в его потомках пробельные символы. Единственным исключением из этого правила может быть опять же атрибут xml:space
, заданный в элементе-потомке со значением "default"
.
Читать дальше