Вход/Регистрация
Технология XSLT
вернуться

Валиков Алексей Н.

Шрифт:

<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.

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

Пример
Листинг 5.16. Основное преобразование
  • Читать дальше
  • 1
  • ...
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: