Чтение онлайн

на главную - закладки

Жанры

Технология XSLT

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

Шрифт:

 • 

@префикс:*
или
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>

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

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

Релокант

Ascold Flow
1. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант

Я тебя верну

Вечная Ольга
2. Сага о подсолнухах
Любовные романы:
современные любовные романы
эро литература
5.50
рейтинг книги
Я тебя верну

Лорд Системы

Токсик Саша
1. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
4.00
рейтинг книги
Лорд Системы

Надуй щеки! Том 6

Вишневский Сергей Викторович
6. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 6

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера

Система Возвышения. (цикл 1-8) - Николай Раздоров

Раздоров Николай
Система Возвышения
Фантастика:
боевая фантастика
4.65
рейтинг книги
Система Возвышения. (цикл 1-8) - Николай Раздоров

Черный Маг Императора 7 (CИ)

Герда Александр
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)

Город Богов 4

Парсиев Дмитрий
4. Профсоюз водителей грузовых драконов
Фантастика:
юмористическое фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Город Богов 4

Воевода

Ланцов Михаил Алексеевич
5. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Воевода

Девочка из прошлого

Тоцка Тала
3. Айдаровы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девочка из прошлого

Бастард Императора

Орлов Андрей Юрьевич
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Бастард Императора

Санек 4

Седой Василий
4. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 4

Семья. Измена. Развод

Высоцкая Мария Николаевна
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Семья. Измена. Развод

Ты нас предал

Безрукова Елена
1. Измены. Кантемировы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты нас предал