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

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

Жанры

Технология XSLT

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

Шрифт:

□ атрибут

match
элемента
xsl:template
.

Последние два случая паттернов отличаются от первого тем, что в них нельзя использовать переменные. Определение вида

<xsl:template match="*[name = $name]">

 ...

</xsl:template>

будет некорректным.

Семантика паттернов

Остановимся подробнее на вопросе — что же означает "соответствие узла некоторому паттерну".

Прежде

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

Узел

X
соответствует паттерну
P
тогда и только тогда, когда существует такой узел
Y
, принадлежащий оси
ancestor-or-self
узла
X
, что множество, получаемое в результате вычисления выражения
P
в контексте узла
Y
будет содержать узел
X
.

Пример

Рассмотрим это определение на примере паттерна

body//а
. Строго говоря, узел будет соответствовать этому паттерну, если во множестве его предков (плюс сам узел) найдется такой узел, что множество
body//а
, вычисленное в его контексте, будет содержать проверяемый узел. На практике первые два элемента
а
приведенного ниже документа соответствуют этому паттерну, потому что существует элемент
html
, содержащий элемент
body
, потомками которого эти элементы
а
являются.

Листинг 6.2

<html>

 <body>

<a>

<!-- Соответствует паттерну body//a -->

</a>

<a>

<!-- Соответствует паттерну body//a -->

</a>

 </body>

 <а>

<!-- Не соответствует паттерну body//а -->

 </а>

</html>

Существует также и более простое определение соответствия. Узел

X
соответствует паттерну
P
тогда и только тогда, когда
X
принадлежит множеству
//P
. В приведенном выше примере паттерну
body//а
соответствуют все узлы множества
//body//а
.

Эти определения эквивалентны. На практике следует пользоваться тем, которое кажется более понятным.

Примеры паттернов

□ 

body
— соответствует элементам
body
с нулевым пространством имен;

□ 

xhtml:body
— соответствует элементам
body
,
принадлежащим пространству имен с префиксом
xhtml
;

□ 

body/a
— соответствует дочерним элементам
а
элемента
body
;

□ 

*
— соответствует любому элементу, который принадлежит нулевому пространству имен;

□ 

а[1]
— соответствует каждому первому элементу
а
своего родительского узла; элемент будет соответствовать этому паттерну, если ему не предшествует никакой братский элемент
a
— то есть из всех дочерних элементов
а
некоторого узла этому паттерну будет соответствовать только первый в порядке просмотра документа элемент;

□ 

a[position mod 2 = 0]
— соответствует каждому четному элементу
a
своего родительского узла; иначе говоря, из всех элементов
а
некоторого узла этому паттерну будут соответствовать только четные;

□ 

/
— соответствует корневому узлу;

□ 

/html
— узел будет соответствовать этому паттерну тогда и только тогда, когда он является элементом с именем
html
и нулевым пространством имен и находится при этом в корне элемента;

□ 

//html
— соответствует любому элементу
html
документа, принадлежащему нулевому пространству имен; этот паттерн равносилен паттерну
html
;

□ 

*[starts-with(local-name, 'A') or starts-with(local-name, 'a')]
— соответствует любому элементу, имя которого начинается на букву
"а"
в любом регистре символов;

□ 

*[string-length(local-name)=2]
— соответствует любому элементу, локальная часть имени которого состоит из двух символов;

□ 

*[starts-with(namespace-uri,'http') or starts-with(namespace-uri, 'HTTP')]
соответствует любому элементу, URI пространства имен которого начинается на
"http"
или
"HTTP"
;

□ 

br[not(*)]
— соответствует элементу
br
, который не имеет дочерних элементов;

□ 

id('i')
— соответствует элементу, уникальный атрибут которого (атрибут, имеющий тип
ID
) равен
"i"
;

□ 

id('i')/@id
— соответствует атрибуту
id
элемента, уникальный атрибут которого равен
"i"
; заметим, что уникальный атрибут элемента вовсе не обязательно должен иметь имя
id
;

□ 

key('name', 'html')/@href
— соответствует атрибуту
href
узла, значение ключа с именем
"name"
которого равно
"html"
;

□ 

*|@*
— соответствует любому элементу или атрибуту;

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

Бастард

Осадчук Алексей Витальевич
1. Последняя жизнь
Фантастика:
фэнтези
героическая фантастика
попаданцы
5.86
рейтинг книги
Бастард

Последний наследник

Тарс Элиан
11. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний наследник

Мастер темных арканов 2

Карелин Сергей Витальевич
2. Мастер темных арканов
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Мастер темных арканов 2

Неудержимый. Книга XIII

Боярский Андрей
13. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIII

Босс для Несмеяны

Амурская Алёна
11. Семеро боссов корпорации SEVEN
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Босс для Несмеяны

В погоне за женой, или Как укротить попаданку

Орлова Алёна
Фантастика:
фэнтези
6.62
рейтинг книги
В погоне за женой, или Как укротить попаданку

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

По дороге на Оюту

Лунёва Мария
Фантастика:
космическая фантастика
8.67
рейтинг книги
По дороге на Оюту

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Бастард

Майерс Александр
1. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард

Неправильный боец РККА Забабашкин 3

Арх Максим
3. Неправильный солдат Забабашкин
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Неправильный боец РККА Забабашкин 3

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Попаданка для Дракона, или Жена любой ценой

Герр Ольга
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Попаданка для Дракона, или Жена любой ценой

Прорвемся, опера! Книга 2

Киров Никита
2. Опер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прорвемся, опера! Книга 2