- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Технология XSLT - Алексей Валиков
Шрифт:
Интервал:
Закладка:
<xsl:template match="bold">
<b><xsl:value-of select="."/></b>
</xsl:template>
В этом правиле атрибут match говорит о том, что оно должно использоваться для обработки элементов bold — в данном случае они будут заменяться на элементы b. Шаблоны, в которых определен атрибут match, вызываются при помощи инструкции xsl:apply-templates.
Шаблон также может иметь имя, определяемое атрибутом name. Шаблон, в котором задано имя, называется именованным шаблоном. Именованные шаблоны могут вызываться вне зависимости от текущего контекста, и даже вести себя как функции — принимать на вход параметры и возвращать некоторые значения.
Пример<xsl:template name="bold">
<b><xsl:value-of select="."/></b>
</xsl:template>
В отличие от предыдущего примера, это правило не будет обрабатывать какие-либо определенные узлы. Вызвать его можно будет только по имени посредством элемента xsl:call-template.
При определении шаблона нужно обязательно указать хотя бы один из атрибутов match или name, причем эти атрибуты могут присутствовать в xsl:template одновременно.
Атрибут mode определяет режим данного шаблонного правила. Режимы позволяют задавать различные преобразования для одних и тех же частей документа (о них мы поговорим позже).
Атрибут priority используется для определения значения, которое называется приоритетом шаблонного правила. Это значение используется для разрешения конфликтов шаблонов в случае, когда один узел может быть обработан различными правилами.
Атрибуты шаблонного правила не влияют на выполнение его содержимого. Они используются элементами xsl:apply-templates и xsl:call-template при выборе шаблонов. Правила, которые были импортированы в преобразование, вызываются элементом xsl:apply-imports.
Вызов шаблонных правил
Рассмотрим следующий простой пример.
Листинг 5.1. Входящий документ<para><bold>text</bold></para>
Попробуем написать пару шаблонов, которые будут изменять имена элементов para и bold на p и b соответственно. Сначала напишем преобразование для bold:
<xsl:template match="bold">
<b><xsl:value-of select="."/></b>
</xsl:template>
В этом правиле создается элемент b, в который включается текстовое значение текущего узла (то есть, обрабатываемого элемента bold). Применив это преобразование к входящему документу, мы получим следующий результат:
<b>text</b>
Как говорят математики, что и требовалось. Попробуем проделать тот же трюк с элементом para и создадим преобразование, включающее оба правила.
Листинг 5.2. Преобразование с para и bold — версия 1<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="bold">
<b><xsl: value-of select="."/></b>
</xsl:template>
<xsl:template match="para">
<p><xsl:value-of select="."/></p>
</xsl:template>
</xsl:stylesheet>
На этот раз вместо ожидаемого результата вида <p><b>text</b></p> мы получим
<p>
text
</p>
Попробуем ответить на три вопроса: кто виноват, что делать и куда делся элемент b.
Для ответа на вопрос, куда делся элемент b, пожалуй, необходимо будет пояснить, что же именно происходит при преобразовании этого документа. Последовательно рассмотрим стадии этого процесса.
□ Процессор начинает обработку с корневого узла дерева. Он выбирает шаблон, соответствующий этому узлу. В нашем преобразовании такого шаблона нет, значит, процессор применит к корню шаблонное правило, определенное по умолчанию (см. раздел "Встроенные шаблоны" данной главы).
□ По умолчанию шаблонное правило корневого узла обрабатывает все дочерние узлы. В нашем документе единственным дочерним узлом корня будет элемент para.
□ Для элемента para в нашем преобразовании задан шаблон, который и будет применен к этому элементу.
□ В соответствии с этим шаблоном, процессор создаст элемент p и включит в него текстовое значение выражения ".". Как мы знаем, выражение "." является сокращенной формой выражения "self::node()", которое возвратит текущий узел. Таким образом, элемент <xsl:value-of select="."/> вычислит и возвратит строковое значение текущего узла, то есть узла para. Строковым значением элемента является конкатенация всех его текстовых потомков. Единственным текстовым потомком нашего para является текстовый узел со значением "text" и вот он-то и выводится между открывающим и закрывающим тегами созданного элемента p.
Таким образом, элемент b "потерялся" потому, что шаблон для bold просто не вызывался. Виноваты, естественно, мы сами, поскольку не включили его вызов. Осталось только разобраться, как можно вызвать шаблон для обработки элемента bold.
Ответ на этот вопрос предельно прост — для вызова неименованных шаблонных правил В XSLT используется элемент xsl:apply-templates.
Элемент xsl:apply-templates
Синтаксис этого элемента выглядит следующим образом:
<xsl:apply-templates
select="выражение"
mode="режим">
<!-- Содержимое: несколько элементов xsl:sort или xsl:with-param -->
</xsl:apply-templates>
Элемент xsl:apply-templates применяет шаблонные правила к узлам, которые возвращаются выражением, указанным в атрибуте select. Если атрибут select опущен, то xsl:apply-templates применяет шаблонные правила ко всем дочерним узлам текущего узла, то есть
<xsl:apply-templates/>
равносильно
<xsl:apply-templates select="child::node()"/>
Атрибут mode используется для указания режима, в котором должны применяться шаблоны — мы поговорим о различных режимах чуть позже.
Прежде чем двигаться дальше, опишем более подробно, что означает "применить шаблон" (англ. apply — применить, template — шаблон). Применение шаблонов — это составная часть обработки документа, которая может быть описана следующим порядком действий.
□ На первом шаге процессор вычисляет выражение, указанное в атрибуте select. Его значением должно быть множество узлов. Полученное множество узлов упорядочивается и становится текущим списком узлов контекста преобразования.
□ Для каждого из узлов этого списка процессор находит наиболее подходящий шаблон для обработки. Процессор делает этот узел текущим и затем выполняет в измененном контексте выбранное шаблонное правило.
□ Дерево, которое является результатом выполнения шаблона, добавляется в выходящее дерево.
Применительно к нашему примеру с para и bold, мы можем изменить преобразование так, что в создаваемый элемент p будет включаться не текстовое значение элемента para, а результат обработки его дочерних узлов.
Листинг 5.3. Преобразование с para и bold — версия 2<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="bold">
<b><xsl:value-of select="."/></b>
</xsl:template>
<xsl:template match="para">
<p><xsl:apply-templates</p>
</xsl:template>
</xsl:stylesheet>
Проследим за процессом выполнения этого преобразования.
□ Обработка начинается с корневого узла дерева. Для него нет заданных шаблонных правил, значит, применено будет правило по умолчанию — обработать все дочерние узлы. Множество дочерних узлов корня содержит единственный элемент para, значит, текущий список узлов контекста будет состоять из одного узла. Для него в преобразовании определен шаблон, который и будет выполнен процессором.
□ Шаблон, соответствующий элементу para, создает элемент p, содержимым которого будет результат выполнения инструкции xsl:apply-templates, то есть результат применения шаблонов к дочерним узлам текущего узла — элемента para.
□ Единственным дочерним узлом элемента para является элемент bold. Процессор изменит контекст так, что текущий список узлов будет содержать только элемент bold и выполнит соответствующее шаблонное правило, которое создаст элемент b и включит в него узел, вычисленный инструкцией <xsl:value-of select="."/>, то есть текстовый узел со строковым значением текущего узла, элемента bold.
Три шага этого преобразования продемонстрированы на рис. 5.1.