
- •Лекция 4-05
- •Раздел 5. Обработка документов xml
- •Тема 5.1. Вспомогательные языки xml
- •Раздел 5. Обработка документовXml Тема 5.1. Вспомогательные языки xml
- •5.1.1. Язык xPath
- •5.1.1.1. Назначение и спецификации языка xPath
- •5.1.1.2. Типы данных в языках xPath и xQuery
- •5.1.1.3. ВыраженияXPath
- •5.1.1.3.1. Переменные и литералы
- •5.1.1.3.2. Числовые выражения
- •5.1.1.3.3. Выражения отношения
- •5.1.1.3.4. Булевские выражения
- •5.1.1.3.5. Выражения для типов последовательности
- •5.1.1.3.6. Условные выражения
- •5.1.1.3.7. Последовательности
- •5.1.1.3.8. Циклы
- •5.1.1.3.9. Квантификаторы
- •5.1.1.3.10. Выражения для последовательностей узлов
- •5.1.1.3.11. Приоритет операций
- •5.1.1.4. ФункцииXPathи xQuery
- •5.1.1.4.1. Функции-конструкторы
- •5.1.1.4.2. Числовые операторы и функции
- •5.1.1.4.3. Строковые функции
- •5.1.1.4.3.1. Функции сборки-разборки строк
- •5.1.1.4.3.2. Функции сравнения строк
- •5.1.1.4.3.3. Функции строковых значений
- •5.1.1.4.3.4. Функции поиска соответствия в строках
- •5.1.1.4.3.5. Функции с использованием регулярных выражений
- •5.1.1.4.4. Булевские функции и операторы
- •5.1.1.4.5. Функции и операторы для продолжительности, дат и времени
- •5.1.1.4.5.1. Операторы сравнения
- •5.1.1.4.5.2. Функции извлечения компонент
- •5.1.1.4.5.3. Арифметические операторы для продолжительности, дат и времени
- •5.1.1.4.6. Функции для узлов
- •5.1.1.4.7. Функции и операторы для последовательностей
- •5.1.1.4.7.1. Общие функции и операторы
- •5.1.1.4.7.2. Функции проверки количества элементов в последовательности
- •5.1.1.4.7.3. Функции и операторы для операций с множествами
- •5.1.1.4.7.4. Агрегатные функции
- •5.1.1.4.7.5. Операторы и функции, генерирующие последовательности
- •5.1.1.4.8. Контекстные функции
- •5.1.1.5. Выражения пути в xPath
- •5.1.1.5.1. Синтаксис выражений пути
- •5.1.1.5.2. Шаги с использованием оси поиска
- •5.1.1.5.2.2. Проверка узла
- •5.1.1.5.2.3. Предикаты
- •5.1.1.5.2.4. Сокращенный синтаксис выражений с использованием путей поиска
- •5.1.1.5.3. Шаги с использованием фильтров
- •5.1.2. Язык xQuery
- •5.1.2.1. Структура запроса xQuery
- •5.1.2.1.1. Главный модуль
- •5.1.2.1.1.1. Объявления параметров настройки
- •5.1.2.1.1.2. Объявления переменных
- •5.1.2.1.1.3. Объявления функций
- •5.1.2.1.1.4. Объявления опций
- •5.1.2.1.1.5. Операторы импорта
- •5.1.2.1.1.6. Объявления пространства имен
- •5.1.2.1.2. Библиотечный модуль
- •5.1.2.1.3. Комментарии
- •5.1.2.2. КонструкторыXQuery
- •5.1.2.2.1. Прямой конструктор
- •5.1.2.2.2. Вычисляемый конструктор
- •5.1.2.2.2.1. Вычисляемые конструкторы элемента и атрибута
- •5.1.2.2.2.2. Вычисляемый конструктор документа
- •5.1.2.2.2.3. Вычисляемый конструктор текстового узла
- •5.1.2.2.2.4. Вычисляемый конструктор комментария
- •5.1.2.2.2.5. Вычисляемый конструктор инструкции по обработке
- •5.1.2.3. Выражения flwor
- •5.1.2.3.1. Операторыfor,letиreturn
- •5.1.2.3.2. Операторwhere
- •5.1.2.3.3. Операторorderby
- •5.1.3. ЯзыкXLink
- •5.1.3.1. Глобальные атрибуты языкаXLink
- •5.1.3.2. Простые ссылки
- •5.1.3.3. Расширенные ссылки
- •5.1.3.4. Внешние ссылки
- •5.1.3.5. Задание базовогоUrIдля документаXml
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".