
- •Лекция 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. Выражения пути в xPath
5.1.1.5.1. Синтаксис выражений пути
Одна из важнейших функций XPath– это выбор множеств узлов в документе. Особый вид выраженийXPath, называемыйвыражениями пути(pathexpressions), позволяет выбирать в документе множество узлов в соответствии заданными критериями.
Выражение пути состоит из одного или более шагов, каждый из которых отделяется один от другого либо с помощью символа "/", либо с помощью символов "//". Выражение пути может также начинаться с символов "/"или "//". Результатом каждого шага поиска является последовательность узлов (возможно пустая).
Если выражение пути начинается с символа "/", то поиск начинается с корневого узла документа, а если с символов "//" – с контекстного узла документа, включая сам контекстный узел. Если символ "/" задан внутри выражения пути, то выполняется переход к следующему шагу поиска. Символы "//" внутри выражения пути означают, что следующий шаг поиска будет выполняться для потомков контекстного узла документа, включая сам контекстный узел.
В XPath2.0 определены два вида шагов поиска:
шаг с использованием оси поиска (axisstep);
шаг с использованием фильтра (filterstep).
5.1.1.5.2. Шаги с использованием оси поиска
Шаги с использованием оси поиска состоят из трех компонент:
оси (axis), указывающей дерево взаимоотношений между текущим узлом контекста и узлами, отбираемыми на данном шаге адресации;
правила проверки узлов, указывающего тип и расширенное название узлов, отбираемых на данном шаге адресации;
нуля или более предикатов, использующих произвольные выражения для дальнейшего отбора в наборе узлов, собранных на данном шаге адресации.
Шаг с использованием оси поиска имеет следующий синтаксис:
имя-оси::проверка-узла[предикат]
Последовательность узлов, полученных на каждом шаге адресации, – это множество узлов, полученных в результате обработки ранее собранного набора узлов с учетом оси, правила проверки узлов и последующего отсева полученного набора узлов каждым из представленных предикатов.
Пример документа XML:
Следующий документ XML (email.xml) содержит пять сообщений электронной почты:
<?xml version="1.0" encoding="Windows-1251"?>
<email-folder>
<message>
<!-- Сообщение 1 -->
<header>
<address>
<from value="ivanov@mail.com"/>
<to value="petrov@mail.com"/>
</address>
<subject>Поздравление</subject>
</header>
<body>Поздравляю с днем рождения!</body>
</message>
<message>
<!-- Сообщение 2 -->
<header>
<address>
<from value="ivanov@mail.com"/>
<to value="sidorov@mail.com"/>
</address>
<subject>Напоминание</subject>
</header>
<body>Встречаемся в 10.00.</body>
</message>
<message>
<!-- Сообщение 3 -->
<header>
<address>
<from value="sidorov@mail.com"/>
<to value="ivanov@mail.com"/>
</address>
<subject>Отказ</subject>
</header>
<body>Я не смогу в это время.</body>
</message>
<message>
<!-- Сообщение 4 -->
<header>
<address>
<from value="ivanov@mail.com"/>
<to value="sidorov@mail.com"/>
</address>
<subject>Вопрос</subject>
</header>
<body>Когда ты может подойти?</body>
</message>
<message>
<!-- Сообщение 5 -->
<header>
<address>
<from value="sidorov@mail.com"/>
<to value="ivanov@mail.com"/>
</address>
<subject>Ответ</subject>
</header>
<body>Я смогу подойти в 12.30.</body>
</message>
</email-folder>
5.1.1.5.2.1. Оси
Поиск в XML-документе начинается с контекстного узла в дереве XPathи выполняется относительно этого узла.
Ось определяет, какой узел относительно контекстного узла должен быть включен в процесс поиска. Ось также определяет порядок узлов в наборе узлов. Ось, выбирающая узлы, следующие за контекстным узлом в порядке расположения в документе, называется прямой. Ось, выбирающая узлы, предшествующие контекстному узлу, называетсяобратной. Всего в спецификацииXPathопределено 13 осей. Графическое представление дерева узлов и оси для документаemail.xmlприведены на рис. 5.1.2.
Ось selfопределяет сам контекстный узел (эта ось не имеет направления).
В спецификации XPathопределены следующиепрямые оси:
ось self– сам контекстный узел;
ось child– все дочерние узлы контекстного узла следующих типов: узлы элементов, текстовых узлов, узлов комментариев и инструкций по обработке (узлы документов, атрибутов и пространств имен не могут быть дочерними узлами);
ось descendant – все потомки контекстного узла, т.е. все дочерние узлы, дочерние узлы дочерних узлов и так далее;
ось descendant-or-self – сам контекстный узел и все его потомки;
ось following-sibling– все узлы, имеющие тот же родительский элемент, что и контекстный узел, и следующие по порядку за контекстным узлом (если узел является узлом атрибута или узлом пространства имен, эта ось пуста);
ось following– все узлы, имеющие тот же корневой элемент, что и контекстный узел, не являющиеся потомками контекстного узла и следующие по порядку за контекстным узлом;
ось attribute– все узлы атрибутов контекстного узла (эта ось пуста если контекстный узел не является элементом);
ось namespace– все узлы пространства имен контекстного узла (эта ось пуста если контекстный узел не является элементом).
Рис. 5.1.2. Дерево XPath и оси для документа email.xml
В спецификации XPathопределены также следующиеобратные оси:
ось parent– родительский узел контекстного узла (если узел не имеет родительского узла, эта ось пуста);
ось ancestor – все предки контекстного узла, т.е. родительский узел, родительский узел родительского узла и так далее;
ось ancestor-or-self – сам контекстный узел и все его предки;
ось preceding-sibling– все узлы, имеющие тот же родительский элемент, что и контекстный узел, и следующие по порядку перед контекстным узлом (если узел является узлом атрибута или узлом пространства имен, эта ось пуста);
ось preceding– все узлы, имеющие тот же корневой элемент, что и контекстный узел, не являющиеся потомками контекстного узла и следующие по порядку перед контекстным узлом.