<!-- Четвертый шаблон -->
<xsl:template match='node()'>
<xsl:message>
<xsl:text>4</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: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.
Между тем, явное указание приоритета шаблона не может изменить порядок его импорта. То есть, если бы в предыдущем примере четвертый шаблон был бы вынесен во внешний модуль и импортирован в основное преобразование, в любом случае он бы применялся только в отсутствие более подходящих правил.
<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>
