соответствуют узлы, которые соответствуют относительному пути при отсчете от любого узла документа. Например, паттерну
//a/b
соответствуют любые элементы
b
, имеющие родителем элемент с именем
а
. Фактически, этот паттерн не отличается от паттерна
a/b
(единственное различие в том, что они могут иметь разные приоритеты).
Последние три случая в правиле
LocationPathPattern
относятся к таким
механизмам XSLT, как адресация по уникальным идентификаторам и ключам.
В первой главе книги, когда мы описывали синтаксис и семантику языка разметки документов XML, мы коротко остановились на уникальных атрибутах — атрибутах, которые определяются типом
ID
и значения которых должны быть уникальны внутри документа. Как мы узнали, это позволяет более эффективно обращаться к элементам в документе.
XSLT позволяет использовать уникальные атрибуты элементов при помощи функции
id
, которая возвращает множество, состоящее из узла, уникальный атрибут которого равен переданному ей значению, или пустое множество, если такого элемента нет.
Кроме того, XSLT предоставляет похожий механизм, механизм ключей, который выбирает узлы не по уникальным атрибутам, а по значениям именованных ключей, определенных в преобразовании. Для этого служит функция
key
.
Поскольку два этих механизма схожи по семантике, они определяются в XSLT в едином паттерне:
[PT3] IdKeyPattern ::= 'id' '(' Literal ')'
| 'key' '(' Literal ',' Literal ')'
Этому паттерну соответствуют только узлы, принадлежащие результату одной из двух функций —
id
или
key
.
Оставим детали использования ключей и
ID
– атрибутов на потом и вернемся к разбору вариантов синтаксиса паттернов.
□ Паттерну
IdKeyPattern '/' RelativePathPattern
соответствуют узлы, которые соответствуют образцу пути
, а его родитель в свою очередь имеет уникальный атрибут со значением
"index5"
.
□ Паттерн
IdKeyPattern '//' RelativePathPattern
аналогичен предыдущему: ему соответствуют узлы, которые соответствуют паттерну
RelativePathPattern
, отсчитанному от любого потомка или самого узла, входящего в
IdKeyPattern
. Например, паттерну
id('index5')//a/b
будет соответствовать любой дочерний элемент
b
элемента
a
, являющегося потомком элемента, уникальный атрибут которого имеет значение
index5
, или если он сам имеет такой атрибут.
Мы более подробно остановимся на ключевых паттернах, когда будем разбирать функции
id
и
key
, а пока обратимся к главной детали всех вышеперечисленных продукций — к образцу относительного пути,
RelativePathPattern
. Его продукция записывается в следующем виде:
[PT4] RelativePathPattern
::= StepPattern
| RelativePathPattern '/' StepPattern
| RelativePathPattern '//' StepPattern
Если сравнить это правило с упрощенной продукцией
RelativeLocationPath
, можно заметить совпадение с точностью до имен продукций. Образец относительного пути строится точно так же, как и обычный путь выборки — перечислением через разделяющие символы
"/"
и
"//"
шагов, в данном случае — шагов образца относительного пути.