Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
□ Инструкции по обработке ,
которая идет в документе первой, соответствует только один, четвертый шаблон.
□ Корневому элементу 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
. Например, если бы в предыдущем преобразовании четвертый шаблон был определен в виде
4
то его приоритет был бы выше, чем у всех остальных шаблонов, а поскольку он соответствует всем узлам в обрабатываемом документе, то во всех случаях применялся бы только он один. Сообщения процессора имели бы вид
4 template matched ORA.
4 template matched b.
4 template matched a.
4 template matched b.
4 template matched b.
4 template matched c.
Между тем, явное указание приоритета шаблона не может изменить порядок его импорта. То есть, если бы в предыдущем примере четвертый шаблон был бы вынесен во внешний модуль и импортирован в основное преобразование, в любом случае он бы применялся только в отсутствие более подходящих правил.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:a="a">
1
2
3
5
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:a="a">
4
template matched
.
Как уже было сказано ранее, четвертое преобразование, вынесенное теперь в импортируемый модуль, при разрешении конфликтов шаблонов будет самым младшим вследствие того, что порядок его импорта меньше, чем у других преобразований. Сообщения процессора будут иметь вид
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
можно использовать в шаблонах для применения правил, которые были импортированы во внешних модулях, но затем переопределены шаблонами основного преобразования.
Предположим, что в преобразованиях часто используется шаблон, который заменяет элементы home
ссылками на сайт http://www.xsltdev.ru:
<���а href="http://www.xsltdev.ru">www.xsltdev.ru
При необходимости этот шаблон может быть переопределен. К примеру, ссылка может выглядеть как
Visit <���а href="http://www.xsltdev.ru">www.xsltdev.ru
Соответственно, шаблон будет иметь вид
Visit
www.xsltdev.ru
Можно заметить, что оба шаблона имеют общую часть, которая выводит гипертекстовую ссылку. Эта часть может быть вынесена во внешнее преобразование home.xsl
.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
www.xsltdev.ru
Для того чтобы использовать внешний шаблон, основное преобразование должно импортировать его при помощи xsl:import
и применять посредством xsl:apply-imports.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
Visit
Элемент xsl:apply-imports
нельзя использовать в блоках xsl:for-each
и при вычислении глобальных переменных. Дело в том, что при обработке xsl:apply-imports
процессор применяет импортируемые правила в соответствии с текущим шаблоном. Текущий шаблон — это то самое правило, которое процессор выполняет при обработке элемента xsl:apply-templates
. При вычислении глобальных переменных и обработке блоков xsl:for-each
текущее правило становится пустым, и, соответственно, вызов xsl:apply-imports
вызовет ошибку.
Элемент xsl:apply-imports
применяет шаблоны точно так же, как и элемент xsl:apply-templates
, но при этом он имеет две особенности.
□ Шаблоны, определенные в основном преобразовании, применяться не будут, поскольку xsl:apply-imports
применяет только импортированные правила.
□ Элемент xsl:apply-imports
применяет только те правила, режим ( mode
) которых совпадает с режимом текущего шаблона.
В текущей версии XSLT xsl:apply-imports
не может вызывать импортированные именованные шаблоны.
Для того чтобы лучше понять, зачем нужна такая сложная схема импорта, проведем аналогию с объектно-ориентированным программированием. Если рассматривать правила преобразований как методы классов, то импорт преобразований будет ни чем иным, как наследованием — все методы (шаблоны) класса-потомка (импортируемого преобразования) будут доступны в классе-наследнике (импортирующем преобразовании). При этом класс-наследник может переопределить методы класса потомка (шаблоны основного преобразования имеют порядок импорта старше, чем шаблоны импортированного преобразования). В этой схеме использование элемента xsl:apply-imports
будет равносильно вызову метода родительского класса вместо переопределенного метода класса потомка.
Приведем пример Java-классов, которые будут аналогичны преобразованиям home.xsl
и base.xsl
.
public class home {
public String home() {
return "www.xsltdev.ru";
}
}
public class base extends home {
public String home() {
return ("Visit " + super.home());
}
}
В этом примере вызов родительского метода super.home()
соответствует применению элементом xsl:apply-imports
импортированного шаблона.
Интервал:
Закладка: