Выбрать главу

  шаблонМ

 </xsclass="underline" otherwise>

</xsclass="underline" choose>

Циклическая обработка

Элемент xsclass="underline" for-each

Конструкция этого элемента такова:

<xsclass="underline" for-each

 select="выражение">

 <!-- Содержимое: несколько элементов xsclass="underline" sort, шаблон -->

</xsclass="underline" for-each>

Элемент xsclass="underline" for-each используется для создания в выходящем документе повторяемых частей структуры. Обязательный атрибут select указывает выражение, результатом вычисления которого должно быть множество узлов. Шаблон, содержащийся в xsclass="underline" for-each, будет выполнен процессором для каждого узла этого множества.

Пример

Мы можем использовать xsclass="underline" for-each для того, чтобы создать список гипертекстовых ссылок для документа вида.

Листинг 7.24. Входящий документ

<html>

 <head>

  <title>I'm just a simple page...</title>

 </head>

 <body>

  Please visit <a href="http://www.aaa.com">this link</a>.

  Or <a href="http://www.bbb.com">this one</a>.

  Or visit <a href="http://www.ccc.com">this site</a>.

  Or click <a href="http://www.ddd.com">here</a>.

 </body>

</html>

Будем считать, что в этом документе элементы гипертекстовых ссылок а являются потомками элемента body, который находится в элементе html.

Листинг 7.25. Шаблон преобразования

<xsclass="underline" template match="/">

 <links>

  <xsclass="underline" for-each select="/html/body//a">

   <a href="{@href}">

    <xsclass="underline" value-of select = "@href"/>

   </a>

  </xsclass="underline" for-each>

 </links>

</xsclass="underline" template>

Листинг 7.26. Результат преобразования

<links>

 <a href="http://www.aaa.com">http://www.aaa.com</a>

 <a href="http://www.bbb.com">http://www.bbb.com</a>

 <a href="http://www.ccc.com">http://www.ccc.com</a>

 <a href="http://www.ddd.com">http://www.ddd.com</a>

</links>

Элемент xsclass="underline" for-each изменяет контекст преобразования. Множество узлов, возвращаемое выражением в атрибуте select, становится текущим множеством узлов, а узел, шаблон для которого выполняется в данный момент, становится текущим узлом.

Как мы знаем, множества узлов в XSLT не имеют внутреннего порядка. Однако, обработка узлов в xsclass="underline" for-each будет происходить в так называемом порядке просмотра документа, который зависит от того, какое выражение использовалось для вычисления обрабатываемого множества. Порядок обработки множества узлов в xsclass="underline" for-each может быть также изменен элементами xsclass="underline" sort, которые могут присутствовать в xsclass="underline" for-each. Элемент xsclass="underline" sort задает сортировку обрабатываемого множества узлов, изменяя, таким образом, порядок просмотра, что часто бывает очень полезно.

Глава 8

Дополнительные элементы и функции языка XSLT

Дополнительные элементы и функции

В этой главе разбираются дополнительные элементы и функции языка XSLT, которые выполняют в преобразованиях различные задачи, непосредственно не связанные с созданием узлов выходящего документа. Дополнительные элементы и функции XSLT расширяют возможности преобразования, предоставляя разного рода вспомогательный сервис.

К дополнительным элементам XSLT мы отнесем следующие:

□ xsclass="underline" preserve-space и xsclass="underline" strip-space — работа с пробельными символами;

□ xsclass="underline" message — сообщения процессора;

□ xsclass="underline" sort — сортировка множеств перед обработкой;

□ xsclass="underline" namespace-alias — определение псевдонимов пространств имен;

□ xsclass="underline" key — определение ключей;

□ xsclass="underline" number — нумерация;

□ xsclass="underline" decimal-format — определение десятичного формата;

□ xsclass="underline" 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. Шаблон преобразования с пробельными символами

<xsclass="underline" template match="/">¶

□□□<a>¶

□□□¶

□□□□□□□□□<b/>¶

□□□□□□¶

□□□□□□□□□</a>¶