Напомним, что приоритет преобразований может быть также явно указан в атрибуте
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="#"/>
<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
можно использовать в шаблонах для применения правил, которые были импортированы во внешних модулях, но затем переопределены шаблонами основного преобразования.
Пример
Предположим, что в преобразованиях часто используется шаблон, который заменяет элементы