Валиков Алексей Н.
Шрифт:
•
@префикс:*
или attribute::префикс:*
— выбор всех атрибутов в определенном пространстве имен. Примеры паттернов с приоритетом, равным
– 0.25
: •
fo:*
— выбор всех дочерних элементов в пространстве имен с префиксом fo
; •
attribute::xsl:*
— выбор всех атрибутов текущего элемента, которые находятся в пространстве имен с префиксом xsl
. □ Если паттерн состоит из проверки узла (
NodeTest
), которой предшествует ChildOrAttributeAxisSpecifier
, приоритет шаблона будет равен – 0.5
. Паттерны такого рода будут выглядеть как: •
NodeTest
или child::NodeTest
— выбор всех дочерних узлов, соответствующих данной проверке; •
QNodeTest
или attribute::NodeTest
— выбор всех атрибутов, соответствующих данной проверке. □ Примеры паттернов с приоритетом, равным
– 0.5
: •
text
— выбор дочерних текстовых узлов; •
child::comment
— выбор дочерних комментариев; •
@*
— выбор всех атрибутов данного шаблона. □ Если ни одно из предыдущих условий не выполняется, приоритет шаблона равен
0.5
. Для удобства использования составим таблицу (табл. 5.1) с приоритетами тех или иных паттернов.
Таблица 5.1. Приоритет паттернов
Вид паттерна | Приоритет |
---|---|
QName | 0 |
child::QName | |
@QName | |
attribute::QName | |
processing-instruction(литерал) | |
child::processing-instruction(литерал) | |
префикс:* | – 0.25 |
child::префикс:* | |
@префикс:* | |
attribute::префикс:* | |
NodeTest | – 0.5 |
child::NodeTest | |
@NodeTest | |
attribute::NodeTest | |
Другие паттерны | 0.5 |
Несмотря на то, что вычислением приоритета преобразований занимается процессор, полезно понимать механизм этого вычисления для того, чтобы уметь предсказывать, как будет решен конфликт тех или иных шаблонов. Довольно часто в преобразованиях допускаются ошибки, связанные с приоритетом применения шаблонов.
Пример
Вычислим в качестве упражнения приоритеты шаблонов для следующего примера.
Листинг 5.15. Преобразование
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="a">
<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="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>