- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Технология XSLT - Алексей Валиков
Шрифт:
Интервал:
Закладка:
</xsl:message>
<xsl:apply-templates/>
</xsl:template>
<xsl:template name="print-name">
<xsl:text> template matched </xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>.</xsl:text>
</xsl:template>
</xsl:stylesheet>
Пять шаблонов этого преобразования могут соответствовать одним и тем же узлам, а значит, создавать множество конфликтов, которые будут разрешаться при помощи механизма приоритетов.
Приоритет первого шаблона, паттерн которого соответствует продукции QName, будет равен 0. Приоритет второго шаблона будет равен 0.5, поскольку его паттерн не удовлетворяет другим условиям. Паттерн третьего шаблона имеет вид NCName:*, а значит, его приоритет равен -0.25. Приоритет четвертого шаблона равен -0.5, поскольку его паттерн является проверкой узла (NodeTest). Приоритет последнего, пятого шаблона будет равен 0, поскольку паттерн b соответствует продукции QName.
Попробуем применить это преобразование к следующему документу:
<?ORA bypass="yes"?>
<b>
<a xmlns="a">
<b>
<b>
<c/>
</b>
</b>
</a>
</b>
Проследим за тем, как будет выполняться преобразование.
□ Инструкции по обработке <?ORA bypass="yes"?>, которая идет в документе первой, соответствует только один, четвертый шаблон.
□ Корневому элементу b соответствуют два шаблона — четвертый и пятый, однако приоритет пятого шаблона выше, и поэтому применен будет именно он.
□ Следующему элементу, a, соответствуют третий и четвертый шаблоны. Здесь процессор должен применить третий шаблон, так как его приоритет выше, чем приоритет четвертого шаблона.
□ Элемент b, включенный в элемент а, соответствует первому, второму, третьему и четвертому шаблонам. Наивысший приоритет из них имеет второй шаблон.
□ Следующему элементу b соответствуют первый, третий и четвертый шаблоны. В этом случае процессор выберет первый шаблон.
□ Элемент с соответствует третьему и четвертому шаблонному правилу. В этом случае процессор должен будет использовать третий шаблон.
Сравнивая этот анализ с сообщениями процессора, можно убедиться в верности прогноза:
4 template matched ORA.
5 template matched b.
3 template matched a.
2 template matched b.
1 template matched b.
3 template matched c.
Напомним, что приоритет преобразований может быть также явно указан в атрибуте priority элемента xsl:template. Например, если бы в предыдущем преобразовании четвертый шаблон был определен в виде
<xsl:template match="node()" priority="1">
<xsl:message>
<xsl:text>4</xsl:text>
<xsl:call-template name="print-name"/>
</xsl:message>
<xsl:apply-templates/>
</xsl:template>
то его приоритет был бы выше, чем у всех остальных шаблонов, а поскольку он соответствует всем узлам в обрабатываемом документе, то во всех случаях применялся бы только он один. Сообщения процессора имели бы вид
4 template matched ORA.
4 template matched b.
4 template matched a.
4 template matched b.
4 template matched b.
4 template matched c.
Между тем, явное указание приоритета шаблона не может изменить порядок его импорта. То есть, если бы в предыдущем примере четвертый шаблон был бы вынесен во внешний модуль и импортирован в основное преобразование, в любом случае он бы применялся только в отсутствие более подходящих правил.
Пример Листинг 5.16. Основное преобразование<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:a="a">
<xsl:import href="b.xsl"/>
<xsl:strip-space elements="*"/>
<xsl:template match="a:b">
<xsl:message>
<xsl:text>1</xsl:text>
<xsl:call-template name="print-name"/>
</xsl:message>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="a:a/a:b">
<xsl:message>
<xsl:text>2</xsl:text>
<xsl:call-template name="print-name"/>
</xsl:message>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="a:*">
<xsl:message>
<xsl:text>3</xsl:text>
<xsl:call-template name="print-name"/>
</xsl :message>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="b">
<xsl:message>
<xsl:text>5</xsl:text>
<xsl:call-template name="print-name"/>
</xsl:message>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
Листинг 5.17. Преобразование b.xsl<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:a="a">
<xsl:strip-space elements="*"/>
<xsl:template match="node()" priority="1">
<xsl:message>
<xsl:text>4</xsl:text>
<xsl:call-template name="print-name"/>
</xsl:message>
<xsl:apply-templates/>
</xsl:template>
<xsl:template name="print-name">
<xsl:text> template matched </xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>.</xsl:text>
</xsl:template>
</xsl:stylesheet>
Как уже было сказано ранее, четвертое преобразование, вынесенное теперь в импортируемый модуль, при разрешении конфликтов шаблонов будет самым младшим вследствие того, что порядок его импорта меньше, чем у других преобразований. Сообщения процессора будут иметь вид
4 template matched ORA.
5 template matched b.
3 template matched a.
2 template matched b.
1 template matched b.
3 template matched c.
Кстати сказать, XSLT предоставляет возможность выполнять в преобразованиях импортированные шаблоны вместо тех, которые, по мнению процессора, лучше подходят. Подобно тому, как для применения шаблонных правил мы использовали элемент xsl:apply-templates, импортированные шаблоны могут быть вызваны элементом xsl:apply-imports.
Элемент xsl:apply-imports
Синтаксис этого элемента:
<xsl:apply-imports/>
Элемент xsl:apply-imports можно использовать в шаблонах для применения правил, которые были импортированы во внешних модулях, но затем переопределены шаблонами основного преобразования.
ПримерПредположим, что в преобразованиях часто используется шаблон, который заменяет элементы home ссылками на сайт http://www.xsltdev.ru:
<xsl:template match="home">
<а href="http://www.xsltdev.ru">www.xsltdev.ru</a>
</xsl:template>
При необходимости этот шаблон может быть переопределен. К примеру, ссылка может выглядеть как
Visit <а href="http://www.xsltdev.ru">www.xsltdev.ru</a>
Соответственно, шаблон будет иметь вид
<xsl:template match="home">
<xsl:text>Visit </xsl:text>
<a href="http://www.xsltdev.ru">www.xsltdev.ru</a>
</xsl:template>
Можно заметить, что оба шаблона имеют общую часть, которая выводит гипертекстовую ссылку. Эта часть может быть вынесена во внешнее преобразование home.xsl.
Листинг 5.18. Преобразование home.xml<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="home">
<a href="http://www.xsltdev.ru">www.xsltdev.ru</a>
</xsl:template>
</xsl:stylesheet>
Для того чтобы использовать внешний шаблон, основное преобразование должно импортировать его при помощи xsl:import и применять посредством xsl:apply-imports.
Листинг 5.19. Основное преобразование base.xsl<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:import href="home.xsl"/>
<xsl:template match="home">
<xsl:text>Visit </xsl:text>
<xsl:apply-imports/>
</xsl:template>
</xsl:stylesheet>
Элемент xsl:apply-imports нельзя использовать в блоках xsl:for-each и при вычислении глобальных переменных. Дело в том, что при обработке xsl:apply-imports процессор применяет импортируемые правила в соответствии с текущим шаблоном. Текущий шаблон — это то самое правило, которое процессор выполняет при обработке элемента xsl:apply-templates. При вычислении глобальных переменных и обработке блоков xsl:for-each текущее правило становится пустым, и, соответственно, вызов xsl:apply-imports вызовет ошибку.
Элемент xsl:apply-imports применяет шаблоны точно так же, как и элемент xsl:apply-templates, но при этом он имеет две особенности.