Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Разрешение конфликтов в шаблонах
Как правило, каждое преобразование в XSLT определяет, включает или импортирует множество шаблонов, которые обрабатывают указанные части документов. При этом один и тот же узел документа может соответствовать нескольким шаблонным правилам. К примеру, элемент content
может быть обработан любым из следующих трех шаблонов.
Ситуация, когда для обработки узла может быть применено несколько правил, называется конфликтом шаблонов. Конфликты такого рода неизбежны практически в любом преобразовании, к примеру, большинство шаблонов будет вступать в конфликт со встроенными правилами преобразования.
Для того чтобы в конфликтной ситуации решить, какой именно из шаблонов должен быть применен к данному узлу, процессоры используют два простых правила.
□ Шаблоны, имеющие младший порядок импорта, исключаются из рассмотрения. Иными словами, из множества правил, подходящих для обработки текущего узла, остаются только правила, имеющие самый старший порядок импорта.
□ Из оставшегося множества выбирается шаблон с наивысшим приоритетом. Если таких шаблонов несколько, процессор может либо выдать ошибку, либо применить тот, который описан в преобразовании последним.
Во втором из этих двух правил, мы встретились с понятием приоритета шаблона. Приоритет шаблона это не что иное, как численное значение, которое может быть указано в атрибуте priority
элемента xsl:template
. В том случае, если значение этого атрибута не определено, приоритет шаблонного правила вычисляется следующим образом.
□ Прежде всего, шаблон, который обрабатывает несколько альтернатив, перечисленных через знак " |
", будет рассматриваться как множество шаблонов, обрабатывающих каждую из возможностей. Например, шаблон с атрибутом match="b|bold|B"
будет рассматриваться как три одинаковых шаблона с атрибутами match="b"
, match="bold"
и match="B"
соответственно.
□ Если паттерн состоит из имени ( QName
) или конструкции processing-instruction( литерал )
, которым предшествует дескриптор оси дочернего узла или атрибута ( ChildOrAttributeAxisSpecifier
), приоритет шаблона равен 0
. Такие паттерны могут иметь следующий вид:
• QName
или child:: QName
— выбор дочерних элементов;
• @ QName
или attribute:: QName
— выбор атрибутов;
• processing-instruction( литерал )
или child::processing-instruction( литерал )
— именной выбор дочерних инструкций по обработке.
Примеры паттернов с приоритетом, равным 0
:
• content
— выбор дочернего элемента content
;
• fo:content
— выбор дочернего элемента content
с префиксом пространств имен fo
;
• child::processing-instruction('арр')
— выбор дочерних инструкций по обработке, которые имеют вид ;
• @xsd:name
— выбор атрибута xsd:name
текущего узла;
• @select
— выбор атрибута select
текущего узла.
□ Если паттерн состоит из конструкции NCName:*
, которой предшествует ChildOrAxisSpecifier
, приоритет шаблона будет равен -0.25
. Такие паттерны могут иметь следующий вид:
• префикс :*
или child:: префикс :*
— выбор всех дочерних элементов в определенном пространстве имен;
• @ префикс :*
или attribute:: префикс :*
— выбор всех атрибутов в определенном пространстве имен.
Примеры паттернов с приоритетом, равным -0.25
:
• fo:*
— выбор всех дочерних элементов в пространстве имен с префиксом fo
;
• attribute::xsl:*
— выбор всех атрибутов текущего элемента, которые находятся в пространстве имен с префиксом xsl
.
□ Если паттерн состоит из проверки узла ( NodeTest
), которой предшествует ChildOrAttributeAxisSpecifier
, приоритет шаблона будет равен -0.5
. Паттерны такого рода будут выглядеть как:
• NodeTest
или child:: NodeTest
— выбор всех дочерних узлов, соответствующих данной проверке;
• QNodeTest
или attribute:: NodeTest
— выбор всех атрибутов, соответствующих данной проверке.
□ Примеры паттернов с приоритетом, равным -0.5
:
• text()
— выбор дочерних текстовых узлов;
• child::comment()
— выбор дочерних комментариев;
• @*
— выбор всех атрибутов данного шаблона.
□ Если ни одно из предыдущих условий не выполняется, приоритет шаблона равен 0.5
.
Для удобства использования составим таблицу (табл. 5.1) с приоритетами тех или иных паттернов.
Таблица 5.1. Приоритет паттернов
Вид паттерна | Приоритет |
---|---|
QName |
0 |
child:: QName |
|
@ QName |
|
attribute:: QName |
|
processing-instruction( литерал ) |
|
child::processing-instruction( литерал ) |
|
префикс :* |
-0.25 |
child:: префикс :* |
|
@ префикс :* |
|
attribute:: префикс :* |
|
NodeTest |
-0.5 |
child:: NodeTest |
|
@ NodeTest |
|
attribute:: NodeTest |
|
Другие паттерны | 0.5 |
Несмотря на то, что вычислением приоритета преобразований занимается процессор, полезно понимать механизм этого вычисления для того, чтобы уметь предсказывать, как будет решен конфликт тех или иных шаблонов. Довольно часто в преобразованиях допускаются ошибки, связанные с приоритетом применения шаблонов.
Вычислим в качестве упражнения приоритеты шаблонов для следующего примера.
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="a">
1
2
3
4
5
template matched
.
Пять шаблонов этого преобразования могут соответствовать одним и тем же узлам, а значит, создавать множество конфликтов, которые будут разрешаться при помощи механизма приоритетов.
Приоритет первого шаблона, паттерн которого соответствует продукции QName, будет равен 0
. Приоритет второго шаблона будет равен 0.5
, поскольку его паттерн не удовлетворяет другим условиям. Паттерн третьего шаблона имеет вид NCName:*
, а значит, его приоритет равен -0.25
. Приоритет четвертого шаблона равен -0.5
, поскольку его паттерн является проверкой узла ( NodeTest
). Приоритет последнего, пятого шаблона будет равен 0, поскольку паттерн b
соответствует продукции QName
.
Попробуем применить это преобразование к следующему документу:
Проследим за тем, как будет выполняться преобразование.
Читать дальшеИнтервал:
Закладка: