- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Технология XSLT - Алексей Валиков
Шрифт:
Интервал:
Закладка:
Использование переменных и параметров в XSLT отличается от их использования в привычных процедурных языках программирования типа С++, Java или Object Pascal из-за того, что их значения не могут изменяться. После того, как переменной или параметру присвоено некоторое изначальное значение, оно будет оставаться неизменным.
Это ограничение оказывает значительное влияние на стиль программирования преобразований. В этом смысле XSLT намного ближе к функциональным языкам типа Lisp. Например, в XSLT часто используется рекурсия, которая является одним из основных принципов функционального программирования.
Выражения
Многие из задач, которые, так или иначе, выполняются во время преобразования, связаны с вычислением выражений. Для этих целей в XSLT используется язык XPath, который помимо выбора множеств узлов дерева может также выполнять некоторые основные операции над данными.
ЗамечаниеНесмотря на то, что XPath является самостоятельным языком, его роль в XSLT настолько велика, что здесь и далее мы будем рассматривать их как единое целое.
Можно выделить четыре основные задачи, для которых в преобразованиях используются выражения:
□ выбор узлов для обработки;
□ описание условий;
□ вычисление строковых значений, которые затем будут использованы в выходящем дереве;
□ вычисление множеств узлов, которые затем будут использованы в выходящем дереве.
Первая из задач непосредственно относится к самому процессу преобразования. Выражения, содержащиеся в атрибутах select элементов xsl:apply-templates и xsl:for-each, вычисляют множества, к узлам которых нужно применить шаблоны.
Пример Листинг 3.16<xsl:template match="HTML">
<html>
<xsl:apply-templates select="HEAD"/>
<xsl:apply-templates select="BODY"/>
</html>
</xsl:template>
В этом шаблонном правиле содержатся два элемента xsl:apply-templates, которые применяют шаблоны к множествам, выбранным выражениями HEAD и BODY соответственно.
Логические выражения XPath могут использоваться в качестве условий в таких элементах, как xsl:if и xsl:when, обеспечивая условную обработку.
ПримерПредположим, что нам нужно выводить различные сообщения в зависимости от возрастной информации, присутствующей во входящем документе:
Листинг 3.17. Входящий документ<person>
<name>Johnny</name>
<age>19</age>
</person>
Листинг 3.18. Преобразование<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">
<xsl:if test="age >= 21">
<xsl:text>Welcome, </xsl:text>
<xsl:value-of select="name"/>
<xsl:text>.</xsl:text>
</xsl:if>
<xsl:if test="age < 21">
<xsl:text>Sorry, </xsl:text>
<xsl:value-of select="name"/>
<xsl:text>, access denied.</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Выделенные выражения age >= 21 и age < 21 (сущности > и < обозначают символы "<", и ">") определяют условия: содержимое первого элемента xsl:if будет выполняться, только если значение элемента age было не меньше 21; содержимое второго — только если значение age было строго меньше 21. Этот же самый шаблон может быть переписан с использованием элементов xsl:choose, xsl:when и xsl:otherwise.
Листинг 3.19<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">
<xsl:choose>
<xsl:when test="age >= 21">
<xsl:text>Welcome, </xsl:text>
<xsl:value-of select="name"/>
<xsl:text>.</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>Sorry, </xsl:text>
<xsl:value-of select="name"/>
<xsl:text>, access denied.</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Результатом этого преобразования будет текст
Sorry, Johnny, access denied.
В этой строке имя johnny было заимствовано из входящего документа. Оно было создано элементом xsl:value-of:
<xsl:value-of select="name"/>
Этот элемент вычислил значение выражения name, которое было указано в его атрибуте select, преобразовал результат вычисления в строку и создал в выходящем документе текстовый узел, содержащий вычисленное значение.
В данном случае выражение name использовалось для генерации символьных данных. Между тем, выражения вполне пригодны и для того, чтобы создавать в выходящем документе целые фрагменты:
Листинг 3.20. Преобразование<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">
<xsl:choose>
<xsl:when test="age >= 21">
<event type="access granted">
<xsl:copy-of select="name"/>
</event>
</xsl:when>
<xsl:otherwise>
<event type="access denied">
<xsl:copy-of select="name"/>
<reason type="underaged">
<xsl:copy-of select="age"/>
</reason>
</event>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Листинг 3.21. Выходящий документ<event type="access denied">
<name>John</name>
<reason type="underaged">
<age>19</age>
</reason>
</event>
Элемент xsl:copy-of, который использовался в этом преобразовании, делает примерно то же самое, что и xsl:value-of — вычисляет значение выражения и включает его в дерево выходящего документа. Главным отличием xsl:copy-of является то, что при его выполнении вычисленное выражение не преобразуется в строку, что позволяет копировать в выходящее дерево множества узлов и результирующие фрагменты. В приведенном выше примере элементы name и age выходящего документа являются копиями элементов name и age входящего документа.
В преобразованиях выражения могут использоваться только в атрибутах элементов и никогда — в тексте самого преобразования. Элемент
<reason type="underaged">
age
</reason>
будет скопирован в выходящий документ, содержащий текст "age". Ни о каком вычислении выражения age речь, конечно же, не идет. Для того чтобы в результирующий документ был скопирован результат вычисления выражения, оно должно быть заключено в атрибут одного из вычисляющих элементов, например, xsl:copy-of:
<reason type="underaged">
<xsl:copy-of select="age"/>
</reason>
В этом случае в элемент reason будет включен результат вычисления выражения age.
Виды выражений
Выражения языка XPath можно условно разделить на несколько основных типов:
□ пути выборки;
□ выражения фильтрации множеств;
□ выражения объединения множеств;
□ сравнения;
□ логические операции;
□ вызовы функций.
Рассмотрим подробно назначение и принципы работы каждого из типов выражений.
Пути выборки
Путь выборки является самым главным видом выражений, которые применяются в XSLT. Путь выборки в соответствии с некоторыми критериями выбирает множество узлов входящего документа.
Путь выборки может быть абсолютным (отсчитываться от корневого узла дерева) или относительным (отсчитываться от контекстного узла). Он может состоять из нескольких шагов выборки, каждый из которых относительно предыдущего шага (или начального узла) выбирает некоторое множество узлов. Результатом вычисления пути выборки является множество узлов, выбранное его последним шагом.
ПримерПредположим, что нам нужно получить узел элемента title, находящийся в элементе head, который находится в элементе html, находящемся в корне документа. Соответствующий путь выборки будет выглядеть как:
/html/head/title
Означает он примерно следующее:
□ "/" — ведущая косая черта обозначает абсолютный путь выборки, то есть путь, который отсчитывается от корневого узла;
□ "html" — шаг выборки элементов html;