Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-05.doc
Скачиваний:
6
Добавлен:
12.05.2015
Размер:
645.12 Кб
Скачать

5.1.1.5.2.3. Предикаты

При выборе узлов каждый шаг выборки может иметь один или несколько предикатов, которые будут фильтровать выбираемый набор узлов. Пре­дикат – это выражение одного из приведенных выше типов, результатом вычисления которого является булевское значение 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".

5.1.1.5.2.4. Сокращенный синтаксис выражений с использованием путей поиска

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

В спецификации XPathопределены следующие сокращения:

  • если в шаге адресации не указана ось, то предполагается ось child::, поэтому осьchild:: часто опускается при описании путей;

  • символы ".." являются сокращенной записью для выраженияparent::node()(родительский узел);

  • символы "//" является сокращенной записью для выражения/descendant-or-self::node()/(корневой узел и все его потомки, т.е. все узлы документа);

  • символ "@" является сокращенной записью для выраженияattribute::(оси атрибутов).

Примеры использования сокращений в путях поиска:

1. .//*— выберет все элементы-потомки контекстного узла.

2. ..//*— выберет все дочерние элементы родителя контекстного узла.

3. @*— выберет все атрибуты контекстного узла.

4. //@*— выберет все атрибуты всех потомков контекстного узла.

5. //*— выберет все элементы документа, содержащего контекстный узел.

6. //@*— выберет все атрибуты всех элементов документа, содержащего контекстный узел.

7. /to— выберет элементыto, принадлежащие дочерним элемен­тамaddressконтекстного узла.

8. to[@value="ivanov@mail.com" or @value="petrov@mail.com"]– выбирает все дочерние элементыtoтекущего узла, в которых атрибутvalueимеет либо значение"ivanov@mail.com", либо значение"petrov@mail.com".

Соседние файлы в папке Лекции