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

ЖАНРЫ

Технология XSLT

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

Шрифт:
Листинг 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"
;

□ 

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

□ 

a|b|с
— соответствует элементам
а
,
b
и
с
;

□ 

node
— соответствует любому узлу, кроме узла атрибута и пространства имен (поскольку они не являются дочерними узлами своих родителей);

□ 

node | attribute::* | namespace::*
— соответствует любому узлу, включая узлы атрибутов и пространств имен;

□ 

node[not(self::text)]
— соответствует любому узлу, кроме текстового узла, узла атрибута и узла пространства имен.

Выражения

Выражения XPath являются наиболее общими конструкциями этого языка. Пути выборки, разобранные ранее, — это всего лишь частный случай выражения. Выражения включают в себя арифметические и логические операции, вызов функций, операции с путями выборки и так далее.

Выражениям языка соответствует нетерминал

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

Базовая конструкция, использующаяся в выражениях, называется первичным выражением (от англ. primary expression). Первичные выражения могут быть переменными, литералами, числами, вызовами функций, а также обычными выражениями Expr, сгруппированными в круглых скобках:

[XP15] PrimaryExpr ::= VariableReference

| '(' Expr ')'

| Literal

| Number

| FunctionCall

Переменные

Переменные вызываются в выражениях XPath по своему имени, которому предшествует символ "

$
". Например, если мы объявили переменную
nodes
:

<xsl:variable name="nodes" select="a/b"/>

то использовать в выражениях мы ее будем как

$nodes
.

Переменные, так же как элементы и атрибуты XML, могут иметь расширенные имена вида

QName
, состоящие из префикса пространства имен и локальной части имени. Это позволяет создавать переменные, принадлежащие различным пространствам имен.

Поделиться с друзьями: