
- •Лекция 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. Обработка документовXml Тема 5.1. Вспомогательные языки xml
5.1.1. Язык xPath
5.1.1.1. Назначение и спецификации языка xPath
Язык XMLпредоставляет многообразные, гибкие и эффективные возможности описания структуры данных. Однако он не обеспечивает средств для навигации в документе и поиска компонент структурированных данных внутри документа, например, для поиска наименований книг по фамилии автора.
Для выполнения часто встречающихся задач такого рода был создан язык путей XML–XMLPathLanguage(или сокращенноXPath). Версия 1.0 рекомендацииXPathбыла принята W3C в ноябре 1999 года.
Следующая версия XPath–XPath2.0 была принята в январе 2007 г. Во время разработки и обсуждения этой версии параллельно создавался язык запросов к документам XML – XQuery (наподобие языка SQL для баз данных). Этот язык создавался как расширение языка XPath. Поэтому, наряду с отдельными спецификациями для языков XPath и XQuery, консорциум W3C выпустил несколько совместных спецификаций для этих языков по моделям данных, формальной семантики, а также функциям и операторам.
Помимо языка XQuery, язык XPath используется также в схемах (при задании ключей и ссылок на ключи), а также в языке XSLT.
5.1.1.2. Типы данных в языках xPath и xQuery
В языке XPath, а также в языке XQuery, используются те же типы данных, что и в схеме XML, дополненные типами данных, введенными для этих языков.
Иерархия данных XPath и XQuery представлена на рис. 5.1.1.
Рис. 5.1.1. Иерархия данных XPath и XQuery
В языках XPath и XQuery добавлены следующие типы данных:
xs:anyAtomicType– любой атомарный, т.е. состоящий из одного значения, тип;
xs:untypedAtomic– любое атомарное данное, которому не может быть приписан какой-либо определенный тип;
xs:untyped– узел элемента, который не проверялся при проверке документа XML или проверка которого была пропущена;
xs:yearMonthDuration– продолжительность в годах и месяцах (производное отxs:duration);
xs:dayTimeDuration– продолжительность в днях, часах, минутах и секундах (производное от xs:duration).
В языке XPathдокумент XML рассматривается как дерево, в котором каждая часть документа представляется узлом.
В XPathопределено семь типов узлов и, соответственно, семь типов данных, представленных на рис. 5.1.1:
узел документа;
элемент;
атрибут;
текст;
комментарий;
инструкция по обработке;
пространство имен.
Каждый узел дерева XPathимеет строковое представление, называемоестроковым значением, котороеXPathиспользует для сравнения узлов.
Для всех узлов в документе определяется порядок, называемый порядком появленияв документе. Он соответствует появлению узлов в XML представлении документа после расшифровки всех общих сущностей. Следовательно, корневой узел всегда будет первым узлом, а узлы элементов будут предшествовать своим непосредственным потомкам. Таким образом, порядок появления в документе упорядочивает узлы элементов согласно очередности появления в XML документе соответствующих открывающих дескрипторов (после подстановки всех сущностей). Считается, что в элементе узлы атрибутов и пространств имен всегда предшествуют непосредственным потомкам элемента. При этом узлы пространств имен предшествуют узлам атрибутов. Относительный порядок следования узлов пространства имен и относительный порядок следования узлов атрибутов зависят от реализации.Обратный порядок появленияв документе – это по..рядок, обратный порядку появления в документе.
Узел документапредставляет весь документ. Непосредственными потомками узла документа являются корневой элемент, а также узлы комментариев и инструкций по обработке. Имя узла документа совпадает с именем корневого элемента. Строковое значение узла документа является объединением строковых значений всех текстовых узлов, являющихся потомками этого узла, выстроенными согласно порядку появления в документе.
Корневой узел не имеет расширенного имени.
Для каждого элемента в документе создается узел элемента. Узел элемента имеет расширенное имя, однако если имя не имеет префикса, URI пространства имен для имени элемента будет нулевым. Непосредственными потомками узла элемента могут быть узлы элементов, узлы комментариев, узлы инструкций обработки и текстовые узлы, образующие его содержание. При этом обрабатываются ссылки на внутренние и внешние сущности, а также выполняется подстановка для ссылок на символы.
Строковое значение узла элемента является объединением строковых значений всех текстовых узлов, являющихся потомками данного узла элемента и предварительно отсортированных согласно порядку появления в документе.
Узел элемента может иметь уникальный идентификатор (ID). Значение этого атрибута декларируется в DTD как типID. Никакие два элемента в пределах одного документа не могут иметь одинаковые уникальные идентификаторы.
С каждым узлом элемента связан набор узлов атрибутов. При этом, хотя сам элемент является родителем каждого из этих узлов атрибутов (в отличие от моделиDOM), узел атрибута непосредственным потомком своего родительского элемента не является.
Элементы не могут совместно использовать узлы атрибутов, т.е если один узел элемента отличается от другого, то ни один из узлов атрибутов, относящихся к первому узлу элемента, не может совпасть ни с одним узлом атрибута, относящимся ко второму узлу элемента.
Атрибут, подставляемый по умолчанию, обрабатывается так же, как атрибут, указанный явно. Если для данного типа элемента в DTD атрибут был объявлен со значением по умолчанию #IMPLIED, однако в элементе этот атрибут представлен не был, считается, что в наборе атрибутов указанного элемента нет узла для этого атрибута.
Узел атрибута имеет расширенное имя. Если имя атрибута не имеет префикса, URI пространства имен для имени атрибута будет нулевым. Узел атрибута также имеет нормализованное строковое значение, равное значению атрибута (с удаленными избыточными пробельными символами).
Для атрибутов, декларирующих пространства имен, соответствующих узлов атрибутов не предусмотрено.
Текстовый узелпредставляет символьные данные элемента. Все символы в секции CDATA обрабатываются как символьные данные. Таким образом, запись<![CDATA[<]]>в исходном документе будет обрабатываться так же, как и<. Таким образом, секция CDATA обрабатывается так, словно были удалены комбинации "<![CDATA[" и "]]>", а все символы "<" и "&" были заменены на<и&соответственно.
Строковым значением текстового узла являются символьные данные, содержащиеся в узле. Расширенного имени этот узел не имеет.
Узел комментарияпредставляет комментарийXML(за исключением комментариев вDTD). Его строковым значением являются содержимое комментария (не включая "<!--" и "-->"). Расширенного имени этот узел также не имеет.
Для каждой инструкции обработкисоздается соответствующийузел. Исключение составляют инструкции обработки, помещенные вDTD. Строковое значение узла инструкции обработки – это та часть инструкции обработки, которая следует за адресатом и возможным пробельным символом. В состав строкового значения также не попадает завершающая комбинация "?>". Инструкция обработки имеет расширенное имя, в котором локальная часть – это адресат инструкции обработки, а URI пространства имен является нулевым.
С каждым элементом связан набор узлов пространства имен: по одному на каждый новый префикс пространства имен, появившийся в области видимости этого элемента, (включая и префиксxml), и еще один узел для пространства имен по умолчанию, если такое пространство имен имеется в области видимости элемента. Данный элемент является родителем каждого такого узла пространства имен, однако узел пространства имен непосредственным потомком соответствующего элемента родителя не становится. Элемент получит узел пространства имен:
для каждого атрибута элемента, чье имя начинается с xmlns:,
для каждого атрибута в элементе-предке, чье имя начинается с xmlns:, при условии, что данный префикс не был затем переопределен самим элементом или его более близким предком,
для атрибута xmlns, если сам элемент или какой-либо из его предков имеют атрибутxmlnsи при этом атрибутxmlnsсамого ближайшего из таких элементов не является пустым.
Узел пространства имен имеет расширенное имя, локальная часть которого является префиксом пространства имен (она является пустой, если данный узел относится к пространству имен по умолчанию), а идентификатор URI пространства имен всегда нулевой.
Строковое значение узла пространства имен – это URI пространства имен, связанного с данным префиксом пространства имен. Если данный URI окажется относительным, он должен обрабатываться точно так же, как URI пространства имен в расширенном имени.