Предикаты
При выборе узлов каждый шаг выборки может иметь один или несколько предикатов, которые будут фильтровать выбираемый набор узлов. Предикат – это выражение одного из приведенных выше типов, результатом вычисления которого является булевское значение true или false. Это выражение вычисляется для каждого узла выделенного набора, и только в том случае, если результатом является true, узел остается в результирующем наборе.
Фильтрация набора узлов выполняется следующим образом:
· Фильтруемое множество сортируется в направлении просмотра оси навигации данного шага. Для осей ancestor, ancestor-or-self, preceding, preceding-sibling фильтруемое множество сортируется в обратном порядке просмотра документа, для остальных осей – в прямом порядке просмотра.
· Выражение предиката вычисляется для каждого узла отсортированного множества в следующем контексте:
• Фильтруемый узел (тот, для которого в данный момент вычисляется предикат) становится контекстным узлом.
• Количество узлов фильтруемого множества становится размером контекста.
• Позиция фильтруемого узла в отсортированном множестве становится позицией контекста.
· Результат вычисления предиката преобразуется в булевский тип согласно следующим правилам:
• Если результатом вычисления является число, равное позиции контекста, булевым значением предиката будет true, в противном случае – false. Например, предикат [2] равносилен предикату [position()=2] – он обратится в истину только для второго узла фильтруемого множества.
• Все остальные типы данных приводятся к булевому типу в соответствии с приведенными выше правилами.
· Из фильтруемого множества исключаются все узлы, булевское значение предиката для которых было false.
· В случае, если в шаге выборки было несколько предикатов, процедура фильтрации повторяется с каждым из них, оставляя в отфильтрованном множестве только те узлы, для которых каждый из предикатов будет истиной.
Таким образом, предикаты определяют свойства, которыми должны обладать выбираемые узлы.
Примеры использования предикатов:
1. child::header[position()=1] – выбирает первый дочерний элемент header контекстного узла.
2. child::header[position()=last()] – выбирает последний дочерний элемент header контекстного узла.
3. child::header[position()=last()-1] – выбирает все, кроме последнего, дочерние элементы header контекстного узла.
4. child::address[attribute::value="ivanov@mail.com"] – выбирает все дочерние элементы address контекстного узла, которые имеют атрибут value со значением "ivanov@mail.com".
5. child::address[attribute::value="ivanov@mail.com" or
attribute::value="sidorov@mail.com"] – выбирает все дочерние элементы address контекстного узла, которые имеют атрибут value либо со значением "ivanov@mail.com", либо со значением "sidorov@mail.com".
Дата добавления: 2015-03-19; просмотров: 547;