- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Технология XSLT - Алексей Валиков
Шрифт:
Интервал:
Закладка:
□ 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. Шаблон преобразования с пробельными символами<xsl:template match="/">¶
¶
□□□<a>¶
□□□¶
□□□□□□□□□<b/>¶
□□□□□□¶
□□□□□□□□□</a>¶
¶
</xsl:template>
Поскольку текстовые узлы этого шаблона содержат только пробельные символы, они будут удалены из дерева преобразования, и результат будет иметь вид:
<a><b/></a>
Вообще, текстовый узел будет сохранен при выполнении хотя бы одного из следующих условий.
□ Он содержит хотя бы один непробельный символ.
□ Он принадлежит элементу, в котором сохранение пробельных символов задано средствами XML, а именно атрибутом xml:space со значением preserve.
□ Он принадлежит элементу, имя которого включено во множество имен элементов, для которых нужно сохранять пробельные символы.
Во всех остальных случаях текстовый узел будет удален.
Продемонстрируем все три случая сохранения текстового узла на примерах.
Первый случай довольно прост. Шаблон
<xsl:template match="/">¶
¶
□□<a/>¶
¶
</xsl:template>
создаст в выходящем документе фрагмент
<а/>
безо всяких пробельных символов, в то время как шаблон
<xsl:template match="/">¶
¶
□□|<a/>|¶
¶
</xsl:template>
создаст фрагмент вида
¶
¶
□□|<a/>|¶
¶
Различие двух этих шаблонов в том, что в первом текстовые узлы содержат текст "¶ ¶ □□" и "¶ ¶ " соответственно, а во втором — "¶ ¶ □□|" и "| ¶ ¶". Текстовые узлы второго шаблона не будут удалены, поскольку они содержат непробельные символы (символы "|").
Второй случай сохранения текстовых узлов основан на использовании возможностей XML по управлению пробельными символами. Если в элементе задан атрибут xml:space со значением "preserve", обрабатывающее программное обеспечение должно сохранять в нем и в его потомках пробельные символы. Единственным исключением из этого правила может быть опять же атрибут xml:space, заданный в элементе-потомке со значением "default".
ПримерШаблон
<xsl:template match="/">¶
□□<а>¶
□□□□<b>¶
□□□□□□<c>¶
□□□□□□□□<d/>¶
□□□□□□</c>¶
□□□□</b>¶
□□</a>¶
</xsl:template>
создаст в выходящем документе фрагмент вида:
<a><b><c><d/></c></b></a>
Если же шаблон будет определен в виде:
<xsl:template match="/">¶
□□<а xml:space="preserve">¶
□□□□<b>¶
□□□□□□<c xml:space="default">¶
□□□□□□□□<d/>¶
□□□□□□</c>¶
□□□□</b>¶
□□</a>¶
</xsl:template>
то в выходящем фрагменте в элементах а и b пробельные символы будут сохранены, а в элементах с и d — удалены:
<а xml:space="preserve">¶
□□□□<b>¶
□□□□□□<c xml: space="default"><d/></c>¶
□□□□</b>¶
□□</а>
В третьем случае сохранение пробельных символов текстового узла зависит от того, принадлежит ли имя родительского элемента особому множеству, называемому множеством имен элементов, для которых следует сохранять пробельные символы или, для краткости, сохраняющее множество.
Для преобразований сохраняющее множество состоит из единственного элемента xsl:text, то есть единственный элемент в преобразовании, для которого пробельные текстовые узлы не будут удаляться, — это элемент xsl:text. Поэтому его часто используют для вывода в выходящем документе пробельных символов.
Для входящих документов сохраняющее множество состоит из имен всех элементов. То есть по умолчанию преобразования сохраняют все пробельные текстовые узлы. Для изменения сохраняющего множества элементов входящего документа используются элементы xsl:preserve-space и xsl:strip-space.
Элементы xsl:preserve-space и xsl:strip-space
Синтаксические конструкции этих элементов очень похожи:
<xsl:preserve-space
elements="токены"/>
<xsl:strip-space
elements="токены"/>
Элемент xsl:preserve-space добавляет, a xsl:strip-space удаляет имя элемента из сохраняющего множества входящего документа.
ПримерПредположим, нам нужно сохранять пробельные символы во всех элементах d и удалять их в элементах с. Тогда в преобразовании достаточно указать
<xsl:preserve-space elements="d"/>
<xsl:strip-space elements="c"/>
Вообще, обязательные атрибуты elements элементов xsl:strip-space и xsl:preserve-space содержат не сами имена элементов, а так называемые проверки имен. Проверка имени имеет три варианта синтаксиса.
□ Синтаксис "*" используется для выбора произвольных имен. Ей будут соответствовать любые имена элементов.
□ Синтаксис "имя" используется для выбора элементов с заданным именем. К примеру, проверке имени "d" будут соответствовать все элементы с именем "d".
□ Синтаксис "префикс:*" используется для выбора всех элементов в данном пространстве имен. К примеру, если в документе определен префикс пространства имен upr в виде атрибута xmlns:upr="http://www.upr.com", проверке имени "upr:*" будут соответствовать все элементы пространства имен, определяемого идентификатором "http://www.upr.com".
ПримерПредположим, что нам необходимо сохранить пробельные символы в элементе с именем с и удалить их в элементе e и элементах, принадлежащих пространству имен, определяемому идентификатором "urn:d".
Листинг 8.2. Входящий документ<а xmlns:d="urn:d">¶
□□<d:b>¶
□□□□<c>¶
□□□□□□</e>¶
□□□□</c>¶
□□</d:b>¶
</a>
Листинг 8.3. Преобразование<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:preserve-space elements="c"/>
<xsl:strip-space elements="e t:*"
xmlns:t="urn:d"/>
<xsl:template match="/">
<xsl:copy-of select="/"/>
</xsl:template>
</xsl:stylesheet>
Листинг 8.4. Выходящий документ<?xml version="1.0" encoding="utf-8"?><a xmlns:d="urn:d">¶