Выбрать главу

□ Следующему элементу, 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 элемента xsclass="underline" template. Например, если бы в предыдущем преобразовании четвертый шаблон был определен в виде

<xsclass="underline" template match="node()" priority="1">

 <xsclass="underline" message>

  <xsclass="underline" text>4</xsclass="underline" text>

  <xsclass="underline" call-template name="print-name"/>

 </xsclass="underline" message>

 <xsclass="underline" apply-templates/>

</xsclass="underline" 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. Основное преобразование

<xsclass="underline" stylesheet

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 version="1.0"

 xmlns:a="a">

 <xsclass="underline" import href="b.xsl"/>

 <xsclass="underline" strip-space elements="*"/>

 <xsclass="underline" template match="a:b">

  <xsclass="underline" message>

   <xsclass="underline" text>1</xsclass="underline" text>

   <xsclass="underline" call-template name="print-name"/>

  </xsclass="underline" message>

  <xsclass="underline" apply-templates/>

 </xsclass="underline" template>

 <xsclass="underline" template match="a:a/a:b">

  <xsclass="underline" message>

   <xsclass="underline" text>2</xsclass="underline" text>

   <xsclass="underline" call-template name="print-name"/>

  </xsclass="underline" message>

  <xsclass="underline" apply-templates/>

 </xsclass="underline" template>

 <xsclass="underline" template match="a:*">

  <xsclass="underline" message>

   <xsclass="underline" text>3</xsclass="underline" text>

   <xsclass="underline" call-template name="print-name"/>

  </xsl :message>

  <xsclass="underline" apply-templates/>

 </xsclass="underline" template>

 <xsclass="underline" template match="b">

  <xsclass="underline" message>

   <xsclass="underline" text>5</xsclass="underline" text>

   <xsclass="underline" call-template name="print-name"/>

  </xsclass="underline" message>

  <xsclass="underline" apply-templates/>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Листинг 5.17. Преобразование b.xsl

<xsclass="underline" stylesheet

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 version="1.0"

 xmlns:a="a">

 <xsclass="underline" strip-space elements="*"/>

 <xsclass="underline" template match="node()" priority="1">

  <xsclass="underline" message>

   <xsclass="underline" text>4</xsclass="underline" text>

   <xsclass="underline" call-template name="print-name"/>

  </xsclass="underline" message>

  <xsclass="underline" apply-templates/>

 </xsclass="underline" template>

 <xsclass="underline" template name="print-name">

  <xsclass="underline" text> template matched </xsclass="underline" text>

  <xsclass="underline" value-of select="name()"/>

  <xsclass="underline" text>.</xsclass="underline" text>

 </xsclass="underline" template>

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

Элемент xsclass="underline" apply-imports

Синтаксис этого элемента:

<xsclass="underline" apply-imports/>

Элемент xsclass="underline" apply-imports можно использовать в шаблонах для применения правил, которые были импортированы во внешних модулях, но затем переопределены шаблонами основного преобразования.

Пример

Предположим, что в преобразованиях часто используется шаблон, который заменяет элементы home ссылками на сайт http://www.xsltdev.ru:

<xsclass="underline" template match="home">

 <а href="http://www.xsltdev.ru">www.xsltdev.ru</a>

</xsclass="underline" template>

При необходимости этот шаблон может быть переопределен. К примеру, ссылка может выглядеть как

Visit <а href="http://www.xsltdev.ru">www.xsltdev.ru</a>

Соответственно, шаблон будет иметь вид

<xsclass="underline" template match="home">

 <xsclass="underline" text>Visit </xsclass="underline" text>

 <a href="http://www.xsltdev.ru">www.xsltdev.ru</a>

</xsclass="underline" template>

Можно заметить, что оба шаблона имеют общую часть, которая выводит гипертекстовую ссылку. Эта часть может быть вынесена во внешнее преобразование home.xsl.