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.
Между тем, явное указание приоритета шаблона не может изменить порядок его импорта. То есть, если бы в предыдущем примере четвертый шаблон был бы вынесен во внешний модуль и импортирован в основное преобразование, в любом случае он бы применялся только в отсутствие более подходящих правил.
Пример
Листинг 5.16. Основное преобразование
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:a="a">
1
2
3
5
Листинг 5.17. Преобразование b.xsl
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.
Листинг 5.18. Преобразование home.xml
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
www.xsltdev.ru
Для того чтобы использовать внешний шаблон, основное преобразование должно импортировать его при помощи xsl:importи применять посредством xsl:apply-imports.
Листинг 5.19. Основное преобразование base.xsl
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будет равносильно вызову метода родительского класса вместо переопределенного метода класса потомка.
Читать дальше