Языки описания информации Лекция 4. Кафедра «ОСУ» Весенний семестр 2010/2011 уч. года XPath.

Презентация:



Advertisements
Похожие презентации
XML eXtensible Markup Language 1.Пространства имён (Namespaces) 2.Язык навигации внутри XML-документа (XPath)
Advertisements

Java Advanced XML Path Language 1.0 (XPath 1.0). 2 СПбГУ ИТМО Georgiy KorneevJava Advanced / XPath 1.0 Содержание 1.Введение 2.Пути 3.Выражения 4.Функции.
XML- технологии Лекция 3 XPath- адресация. Что такое XPath? XPath - это синтаксис для адресации частей XML- документа XPath использует пути для адресации.
XML eXtensible Markup Language 1.Язык навигации внутри XML-документа (XPath) 2.Пространства имён (Namespaces) 3.Язык трансформаций (XSLT)
Объектно-ориентированный язык программирования. Переменная - эта поименованная ячейка памяти, хранящая какое-либо одно значение (одно число, один фрагмент.
Технология Идентификации Ресурсов X-Pointer. Предназначение X-Pointer – это язык, описывающий местонахождение тех или иных ресурсов. Выражения языка X-Pointer.
Язык запросов XML. XML (Extensible Markup Language) - это новый SGML-производный язык разметки документов, позволяющий структурировать информацию разного.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
XML eXtensible Markup Language 1.Определение типа документов (DTD) 2.Язык навигации внутри XML-документа (XPath)
Строки, Списки, Кортежи.. Строки (string) Строка-это последовательность букв Для обозначения строки используются одинарные или двойные кавычки. Для длинных.
XPath выступает в роли подъязыка преобразований XSLT и XPointer. Выражение XPath используется для манипуляции строками, в числовых выражениях, а также.
Переменные и операторы УРОК 2. Переменные ПЕРЕМЕННАЯ – ?... контейнер для хранения данных. Переменная имеет имя – это….? последовательность букв, цифр.
Языки описания информации Лекция 4. Кафедра «ОСУ» Весенний семестр 2010/2011 уч. года XPath.
XML и XSLT (2) Матросов Александр Васильевич Санкт-Петербургский государственный университет.
Microsoft Excel Использование встроенных функций. Формулы, их копирование, расчеты Выполнила ученица 10 класса Образцова Надежда.
СУБД 5. SQL для выборки данных. 2 SELECT Обработка элементов оператора SELECT выполняется в следующей последовательности: FROM – определяются имена используемых.
Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
WEB- ТЕХНОЛОГИИ Лекция 4. Задача преобразования XML- данных 1 Задача преобразования Для передачи данных между разными приложениями необходимо преобразовать.
Презентация на тему: Ключевое слово TOP n [PERCENT] [WITH TIES]
Тема: Управление потоком в PHP Изучить возможности языка PHP при решении задач, требующих использования условного оператора. Рассмотреть примеры управления.
Транксрипт:

Языки описания информации Лекция 4. Кафедра «ОСУ» Весенний семестр 2010/2011 уч. года XPath

Описание взаимосвязи между XML- документами Языки разметки описывают информацию, одним из свойств которой является сильная связанность. Содержание одного XML-документа может быть связано с содержанием большого количества других XML-документов. При этом разные документы могут размещаться на разных узлах компьютерной сети. Таким образом множество XML-документов может образовывать сложную сеть документов, описывающих информацию об окружающем мире. Широко известным примером такой сети является World Wide Web (Web-сеть), которая содержит множество связанных между собой HTML-документов (web-страниц) расположенных на разных компьютерах Интернет сети.

Языки взаимосвязи между документами Для описания взаимосвязей между документами разработан набор языков, таких, как XPath, XPointer и XLink. Эти языки используются совместно и каждый из них имеет свое назначение: – язык XPath предназначен для идентификации отдельных частей XML-документа, чтобы можно было на них ссылаться; – язык XPointer используется для описания ссылок из одного XML-документа на некоторую часть другого XML- документа, который расположен в локальной или глобальной компьютерной сети; для составления ссылок используются выражения на языке XPath; – язык XLink предназначен для встраивания в XML- документы ссылок на другие XML-документы (при этом используется язык XPointer).

Эти языки предоставляют возможность связывания XML-документов. То, как эти связи (ссылки) реально используются, зависит от программ, обрабатывающих эти XML-документы (XML- процессоров).

Язык XPath ( XML Path Language)

Язык XPath Язык XPath используется для идентификации различных частей XML документов. Язык XPath использует синтаксис отличный от XML синтаксиса. XPath позволяет писать выражения, ссылающиеся на – первый элемент «person», – седьмой дочерний элемент третьего элемента «person», – атрибут ID первого элемента «person», содержащий строку «Фред Джоунс», – все инструкции обработки xml-stylesheet в прологе документа и т. д. С помощью выражений на языке XPath можно задавать узлы: – по положению, – по относительному положению, – по типу, – по содержимому – и другим критериям. В выражениях XPath могут также использоваться числа, строки, логические операции. – Это позволяет в таблицах стилей XSLT выполнять простейшие арифметические вычисления для нумерации и создания перекрестных ссылок. Строковые операции в XPath позволяют XSLT выполнять такие задачи, как перевод заголовка главы в верхний регистр в шапке при сохранении смешанного регистра в ссылке в основном тексте.

Язык XPath Язык XML Path Language (XPath) предназначен для описания указателей (или поисковых запросов) на части XML-документов. Он использует синтаксис, отличный от синтаксиса языка XML. С его помощью можно записывать выражения, ссылающиеся на некоторый конкретный элемент или на группу элементов XML-документа. XPath позволяет задавать части документа (элементы, атрибуты, комментарии и т.п.) по их абсолютному или относительному положению в документе, а также на основе их типа, их содержимого или других критериев. В настоящее время есть две стандартизированные организацией W3C версии языка XPath: 1.0 и 2.0.

XPath Versions XPath 1.0 became a W3C Recommendation November 16, XPath 2.0 became a W3C Recommendation January 23, XPath 2.0 is a language derived from XPath 1.0 and XQuery. The XPath 2.0 and XQuery 1.0 are generated from a common source, sharing much of the same syntax, and much of the text is identical. W3C XSL Specifications and Timeline SpecificationDraft / ProposalRecommendation XPath Nov 1999 XPath 2.0 Requirements03. Jun 2005 XPath 2.0 Language 23. Jan 2007 XPath 2.0 Functions 23. Jan 2007 XPath 2.0 Data Model 23. Jan 2007 XPath 2.0 Semantics 23. Jan 2007 XPointer16. Aug 2002

Использование языка XPath Описания частей XML-документов с помощью языка XPath могут использоваться с разными целями: – на языке XPointer для задании адресов, которые указывают на определенную точку или часть XML- документа, которые используются в ссылках языка XLink; – на языке XSLT для отбора (в качестве шаблона правил) определенных элементов входного документа для их обработки или копирования в выходной документ; – на языках XSLT и XQuery запросов для выборки требуемых данных из XML-документов.

Иерархическая структура XML- документа Языка XPath рассматривает XML-документ, как иерархическую структуру (дерево), состоящую из узлов, следующих семи типов: – узел документа – включает весь XML-документ, помимо корневого элемента также и комментарии, записанные вне его; – узлы элементов – включают элементы документа (начиная с открыввающего тэга и заканчивая закрывающим тэгом); – узлы атрибутов – пара «имя_атрибута=значение_атрибута»; – текстовые узлы – текстовое содержание элементов и атрибутов; – узлы пространств имен; – узлы инструкций обработки; – узлы комментариев.

Вэтом списке нет таких конструкций, как секции CDATA, ссылки на сущности и объявления типа документа. XPath работает с XML-документом уже после того, как эти конструкции уже объединены с документом. Некоторые узлы могут содержать другие узлы. Узел документа, в конечном счете, включает в себя все остальные узлы. Язык XPath позволяет идентифицировать (выбирать) узлы и наборы узлов этого иерархического дерева документа.

Древовидная структура XML документа XML документ представляет собой дерево, состоящее из узлов. Некоторые узлы могут содержать другие узлы. Один корневой узел в конечном счете включает в себя все остальные узлы. XPath – это язык для выбора узлов и наборов узлов этого дерева. С точки зрения XPath существует семь типов узлов: 1. Корневой узел 2. Узлы элементов 3. Текстовые узлы 4. Узлы атрибутов 5. Узлы комментариев 6. Узлы инструкций обработки 7. Узлы пространств имен

Особенности модели данных XPath 1. Корневой узел не совпадает с корневым элементом. – Корневой узел дерева содержит в себе весь документ, в том числе корневой элемент, а также комментарии и инструкции обработки, находящиеся перед начальным тегом корневого элемента или после конечного тега корневого элемента. В приведенном примере корневой узел содержит инструкцию обработки xml-stylesheet и корневой элемент people. 2. Модель данных XPath включает не все, что есть в документе. – В частности, XML-объявление и DTD не доступны через XPath. 3.Однако, если DTD предоставляет значения по умолчанию для каких-либо атрибутов, XPath распознает эти атрибуты. – Например, элемент homepage имеет атрибут xlink:type, предоставляемый DTD. – Разрешаются все ссылки на анализируемые сущности.

Пример XML документа

Древовидная структура XML документа

Взаимосвязи между узлами Parent (родитель) – узел «родителя» содержит под-узлы «ребенка». Children (ребенок) Siblings (братья) – под-узлы имеющие одного «родителя». Descendants (потомки) – все под-узлы ниже по иерархии текущего узла. Ancestors (предки) – все под-узлы выше по иерархии текущего узла.

Parent (родитель) Каждый элемент и атрибут имеет одного «родителя» Например: Harry Potter J K. Rowling Элемент book является родителем узлов: title, author, year и price.

Children (ребенок) Элемент может не иметь, либо иметь одного или несколько «детей» (children). Например: Harry Potter J K. Rowling Элементы title, author, year и price являются «детьми» (children) элемента book.

Siblings (братья) Узлы, которые имеют одного и того же «родителя» (parent). Например: Harry Potter J K. Rowling Все элементы title, author, year и price являются «братьями» (siblings).

Ancestors (предки) Узлы «родители», их «родители» и т.д. Например: Harry Potter J K. Rowling предками элемента title являются элементы book bookstore.

Descendants (потомки) Узлы «ребенок», их «дети» и т.п. Например: Harry Potter J K. Rowling потомками элемента bookstore являются элементы: book, title, author, year и price.

Пути доступа На языке XPath можно записывать разные виды выражений. Наиболее часто используемым выражением языка XPath является путь доступа (маршрутом поиска или path-выражением). Путь доступа задает шаблон для отбора узлов XML- документа. Выбираемая с помощью пути доступа последовательность узлов может быть пустой, содержать один узел или множество узлов. Можно отметить, что пути доступа во многом сходны с путями к файлам, которые используются в файловых системах для указания местонахождения файла или папки.

Контекст Важным понятием при рассмотрении путей доступа является контекст. Контекст – это некая точка отсчета, относительно которой записывается путь доступа. Контекст может включать набор узлов, а также узел, который называется текущим узлом. Изменение контекста, а также текущего узла, выполняется программой, которая обрабатывает XML-документ (например, XSLT- процессор, программа пользователя).

Виды путей доступа В языке XPath имеются два вида путей доступа: – абсолютный путь – он начинается от корневого узла дерева документа (запись такого пути начинается со слэша); – относительный путь – он начинается с текущего (контекстного) узла дерева документа.

Каждый путь записывается в виде набора шагов, разделенных слэшем (/). Каждый шаг это правило выбора узлов из результата (последовательности) полученной на предыдущем шаге. – Например запрос books/book/name, проходит по иерархии документа вплоть до элемента. – Результатом является последовательность элементов типа name.

Структура пути доступа

В полной форме, каждый шаг пути состоит из трех частей: axis::nodetest[predicate] где – axis – ось – направление перемещения по иерархической структуре; – nodetest – критерий выбора узлов; – predicate – предикат –дальнейшее уточнение списка узлов-кандидатов.

Оси axis – ось, определяет направление перемещения по иерархической структуре между узлом контекста и узлами, которые будут проверяться на данном шаге доступа. Ось задает общее направление, в котором выполняется шаг доступа по отношению к узлу контекста. Если ось не задана (при краткой записи пути доступа), то по умолчанию предполагается, что перемещение выполняется по оси дочерних элементов «child::».

Критерий узлов nodetest – критерий узлов, определяет – тип узлов, – либо развернутое имя узлов (шаблон), которые будут выбираться на данном шаге доступа. В первую очередь проверка узла определяет, какие из всех узлов на указанной оси являются кандидатами, – потенциально подходящими узлами для шага доступа.

Предикат predicate – предикат, задает условие (фильтр), которое должно выполняться для дальнейшего уточнения списка узлов- кандидатов. Если для рассматриваемого кандидата условие заданное предикатом выполняется то он отбирается в текущий контекст. Если предикат не задается, то квадратные скобки ([ ]) не пишутся.

Анализ пути доступа Анализ пути доступа выполняется слева направо. Если в пути доступа первым символом является слэш (/), то путь адресации считается абсолютным, то есть начинается с узла документа. – В этом случае за узел контекста на первом шаге берется узел документа. Контекст – это некая точка отсчета, относительно которой рассчитывается следующий шаг адресации. Поэтому на каждом шаге адресации получается новая последовательность узлов обрабатываемого документа, которая становится контекстом для следующего шага адресации.

Для лучшего понимания концепции контекста нужно представить дерево, содержащее узлы. Запрос всех узлов X из корня дерева возвратит один набор результатов, в то время, как запрос таких же узлов из ветви дерева возвратит другой набор результатов. Результат выражения зависит от контекста, к которому оно обращается при выполнении.

Список допустимых осей Ось Описание элементов, включаемых в оси 1ancestor:: Содержат все родительские узлы вплоть до корня дерева. 2 ancestor-or- self:: Содержат все родительские узлы вплоть до корня дерева включая текущий узел. 3attribute:: Содержит только атрибуты (текущий узел должен быть элементом). 4child:: Содержит все прямые дочерние узлы без атрибутов и пространств имен. 5descendant:: Содержит все дочерние узлы со всеми вложенными узлами без атрибутов и пространств имен (все потомки) 6 descendant- or-self:: Содержит все дочерние узлы включая текущий узел со всеми вложенными узлами без атрибутов и пространств имен. 7following:: Содержит все узлы, следующие за текущим в порядке просмотра дерева. Не содержит дочерних узлов текущего, пространств имен и атрибутов.

Список допустимых осей (2) Ось Описание элементов, включаемых в оси 8 following- sibling:: Содержит все узлы, следующие за текущим в порядке просмотра дерева (но на том же уровне вложения от корня). Не содержит дочерних узлов текущего, пространств имен и атрибутов. 9 namespace:: Содержит узлы пространств имен документа. 10 parent:: Содержит один родительский узел. 11 preceding:: Содержит все узлы, предшествующие текущиму в порядке просмотра дерева. Не содержит дочерних узлов текущего, пространств имен и атрибутов. 12 preceding- sibling:: Содержит все узлы, предшествуюшие текущиму в порядке просмотра дерева (но на том же уровне вложения от корня). Не содержит дочерних узлов текущего, пространств имен и атрибутов. 13 self:: Содержит только текущий узел.

Краткая форма записи путей доступа В краткой форме записи путей доступа оси не указываются. В основном используется оператор «дочерний элемент», который выбирает непосредственные дочерние элементы последовательности, указанной слева. (т.е. используется ось child::). Например: – путь доступа author/first-name выделяет все элементы внутри элемента текущего узла контекста.

Таким образом краткая форма записи путей доступа позволяет перемещаться по следующим осям: – оси дочерних узлов (child), – оси родительских узлов (parent), – собственной оси (self), – оси атрибутов (attribute) и – оси потомков с включением контекстного узла (descendant-or-self).

Операторы, используемые для описания путей доступа Оператор Пояснение / Оператор «дочерний элемент»: выбирает непосредственные дочерние элементы последовательности, указанной слева. Если этот оператор пути стоит в начале шаблона, будут выбраны дочерние элементы корневого узла (ось child:: ). // Рекурсивный спуск; поиск заданного элемента на любой глубине. Если этот оператор пути стоит в начале шаблона, рекурсивный спуск будет вестись из корневого узла. (ось descendant:: ) () Оператор группировки операций для явного задания порядка их выполнения. [ ] Предикат шага доступа. [ ] Оператор индексирования элементов последовательности.

Операторы, используемые для описания выражений языка XPath Оператор Пояснение + Операция сложения. - Операция вычитания. div Операция деления с плавающей запятой. * Операция умножения. mod Операция возврата остатка от целочисленного деления. Данная таблица не включает логические операторы и операторы над множествами, которые будут рассмотрены далее.

Приоритеты операций путей доступа Приор итет СимволНазначение 1 () Группирование 2 [ ] Предикаты 3 / и // Операции с путями

Список специальных символов записи пути доступа Оператор Пояснение. Указание на текущий контекст (ось self::node() )... Родитель узла текущего контекста (ось parent:: ). * Символ подстановки; выбирает все элементы независимо от их Атрибут; префикс имени атрибута (ось attribute:: Символ подстановки для атрибута; выбирает все атрибуты независимо от имени.

Текущий контекст Выражение с префиксом в виде точки и косой черты (./) явным образом указывает на использование текущего контекста. Например, выражение./author ссылается на все элементы внутри текущего контекста. Однако, следует запомнить, что это выражение эквивалентно следующей краткой записи пути доступа: author.

Корневой элемент Выражение, использующее косую черту и звездочку (/*), использует в качестве контекста корневой элемент. Например, выражение /* находит корневой элемент документа.

Рекурсивный спуск Выражение, использующее двойную косую черту (//), указывает на поиск, по всем нижележащим уровням иерархии. Если двойная косая черта (//) в начале задается, то поиск выполняется с корневого элемента (он является контекстом поиска). Например, путь //author ссылается на все элементы внутри в любом месте внутри текущего документа.

Конкретные элементы Выражение, которое начинается с имени элемента, ссылается на запрос конкретного элемента, который начинается от текущего узла контекста. Например, путь доступа bookstore/book ссылается на последовательность элементов внутри элементов в текущего узле контекста.

Использование операторов пути С помощью операторов пути (/ и //) описываются последовательности элементов требуемого типа. – принимают в качестве аргументов последовательность «с левой стороны», из которой производится выбор, – и критерий узлов «с правой стороны» как инструкцию, указывающую, какие элементы нужно выбирать. Оператор «дочерний элемент» (/) производит выбор из непосредственных дочерних элементов левой последовательности, Оператор «потомок» (//) производит выбор из всех потомков последовательности с левой стороны. Оператор // можно рассматривать как подстановку для одного или нескольких уровней иерархии.

Операторы пути изменяют контекст по мере выполнения запроса. Последовательно соединяя несколько операторов пути, пользователи могут выполнять обход всего дерева документа.

Примеры использования операторов путей доступа Выражение Результат author/first-name Все элементы внутри элемента текущего узла контекста. bookstore//title Все элементы на первом или более глубоких уровнях элемента (наследники произвольного уровня). Следует отметить отличие от следующего шаблона: bookstore/*/title (описан ниже). bookstore/*/title Все элементы, являющие дочерними у дочерних элементов (т.е. внуков). bookstore//book/exc erpt//emph Все элементы в любом месте внутри элементов, дочерних по отношению к элементам, находящимся в любом месте внутри элемента..//title Все элементы на первом или более глубоких уровнях текущего контекста. Следует учесть, что только в этой ситуации требуется нотация с использованием точек.

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

Примеры использования предикатов Если требуется найти все элементы profession, которые имеют значение «физик», то можно использовать следующее выражение //profession[.="физик"]. – Здесь точка обозначает строковое значение текущего узла. Выражение //person [profession="физик"] позволяет выбирать все элементы person, имеющих дочерний элемент profession со значением «физик». Для выбора элементов person с id, равным p4567, то нужно поместите перед именем атрибута как, например, в выражении

Выражение //name[middle_initial] будет выбирать все элементы name, а затем будет проверяет каждый из них на наличие дочернего элемента middle_initial. Сохраняются только те элементы, в которых есть такой дочерний элемент.

В языке XPath кроме знака равенства поддерживает полный набор операторов сравнения, в том числе, >=,

Логические операторы В языке XPath также имеются логические операторы and и or для логического объединения выражений. – Например, выражение XPath =1910] выбирает все элементы person, значения атрибутов born которых находятся между 1910 и 1920 включительно. – Выражение //name[first_name="Ричард" or first_name="Дик"] выбирает все элементы name, имеющие дочерние элементы first_name со значением Ричард или Дик.

Примеры использования предикатов в путях доступа Выражение Результат book[excerpt] Все элементы, которые содержат хотя бы один дочерний элемент. book[excerpt]/title Все элементы, дочерние по отношению к элементам и содержащие хотя бы один дочерний элемент. book[excerpt]/author [degree] Все элементы, содержащие, по крайней мере, один дочерний элемент и являющиеся дочерними для элементов, содержащих, по крайней мере, один элемент. book[author/degree] Все элементы, имеющие дочерние элементы, у которых, в свою очередь, есть хотя бы один дочерний элемент. author[degree][awar d] Все элементы, которые содержат хотя бы один элемент и хотя бы один элемент.

Примеры использования предикатов в путях доступа (2) Выражение Результат author[(degree or award) and publication] Все элементы, которые содержат хотя бы один дочерний элемент или и хотя бы один дочерний элемент. author[degree and not(publication)] Все элементы, содержащие по крайней мере один дочерний элемент и не содержащие дочерних элементов. author[not(degree or award) and publication] Все элементы, содержащие по крайней мере один дочерний элемент и не содержащие ни элементов, ни элементов. author[last_name = "Bob"] Все элементы, которые содержат хотя бы один дочерний элемент со значением Bob.

Символ подстановки Элементы или атрибуты могут использоваться, без указания их имени, с помощью символа подстановки (*). Данный символ обозначает все элементы, являющиеся дочерними для текущего контекста, независимо от имени тега.

Примеры использования символа подстановки в путях доступа Выражение Результат author/* Все дочерние элементы элементов. book/*/last_name Все элементы, являющиеся «внуками» элементов (т.е. находятся через один уровень иерархии ниже данных элементов). */* Все элементы – "внуки" текущего контекста. myns:book Элемент из пространства имен myns. myns:* Все элементы из пространства имен myns.

Работа с атрибутами В XPath имена атрибутов задаются с помощью за которым следует имя нужного атрибута. Атрибуты и дочерние элементы обрабатываются одинаково, и эти два типа считаются эквивалентными везде, где это возможно. Например, выражение выбирает атрибут born контекстного узла. К атрибутам нельзя применять индексы, поскольку их порядок по определению считается не заданным.

Примеры использования атрибутов Выражение Атрибут style текущего контекста. Все элементы с атрибутом specialty. Атрибут exchange элементов в текущем контексте. otal Возвращает пустой набор узлов, потому что атрибуты не содержат дочерних элементов. Такое выражение не запрещено синтаксисом языка XPath, но, строго говоря, не является допустимым. Все элементы с атрибутами style в текущем контексте. Атрибут style для всех элементов в текущем Все атрибуты контекста текущего элемента.

Работа с комментариями и текстовым содержанием Так как узлы комментариев и текстовые узлы не имеют имен, то для их задания в пути доступа используются следующие функции – comment() соответствует узлам комментарий, являющиеся непосредственным дочерним узлом контекстного узла; – text() соответствуют узлам текста, являющиеся непосредственным дочерним узлом контекстного узла. Каждый комментарий является отдельным узлом комментария. Каждый текстовый узел содержит максимально возможный непрерывный отрезок текста, не прерванный тегом.

Работа инструкциями обработки Функция processing-instruction() без аргументов выбирает все дочерние инструкции обработки контекстного узла. Если аргумент указан, она выбирает только дочерние инструкции обработки, имеющие данную цель. Например, выражение processing- instruction('xml-styles-heet') выбирает все дочерние инструкции обработки контекстного узла, целью которых является xml-stylesheet.

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

Индексирование в последовательности Выражения XPath позволяют легко получать конкретный узел в последовательности. Для этого нужно задать порядковый номер индекса в квадратных скобках (т.е. индексы относятся к фильтру). Первый элемент последовательности имеет номер 1 (хотя некоторые процессоры используют 0 для указания на первый элемент последовательности). Как пояснялось ранее, операция [ ] имеют более высокий приоритет, чем операции / и //. Атрибуты по определению являются неупорядоченными, поэтому для них нельзя использовать индексы.

Примеры выбора элементов последовательности Выражение Результат author[1] Первый элемент в текущем узле контекста. author[first_name][3] Третий элемент, имеющий дочерний элемент. author[last_name[1] = "Bob"] Все элементы, первый дочерний элемент, которых имеет значение Bob. Заметьте, что это эквивалентно выражению в следующей строке. author[last_name [position()=1]= "Bob"] Все элементы, первый дочерний элемент которых имеет значение Bob.

Примеры выбора элементов последовательности Выражение Результат p/text()[2] Второй текстовый узел в каждом элементе узла контекста. ancestor::book[1] Ближайший элемент, который является предком узла контекста. ancestor::book[author][1] Ближайший элемент, который является предком узла контекста и содержит дочерний элемент. ancestor::author[parent:: book][1] Ближайший элемент, который является предком в текущем контексте и является дочерним элементом для элемента.

Примеры выбора элементов последовательности Фрагмент XML-документа: Выражение Результат x/y[1] Первый элемент внутри каждого элемента. x/y[position() = 1] Первый дочерний элемент каждого элемента. (x/y)[1] Первый элемент из всего набора элементов внутри элементов. x[1]/y[2] Второй элемент внутри первого элемента.

Приведенные в табл. примеры являются краткими записями путей доступа, в которых используется неявно ось child::. – Например, путь доступа: x/y[1] эквивалентен пути x/child::y[1]. – Оба выражения означают «для каждого элемента выбирать первый дочерний элемент с именем. Для этой оси последовательность дочерних элементов индексируется в прямом порядке документа.

Для других осей, например ancestor::, в полном пути доступа следует явно указать имя оси. Для данной оси последовательность предков индексируется в обратном порядке документа. – Например, путь доступа x/ancestor::y[1] – выбирает для каждого элемента первого его предка (в обратном порядке документа) с именем. – Синтаксис такой же, но порядок обратный.

Поиск последнего элемента в последовательности Функция last() возвращает значение true для последнего элемента в последовательности. Следует обратить внимание, что функция last() относится к родительскому узлу. Примеры выбора последнего элемента последовательности приведены в табл. Выражение Результат book[last()] Последний элемент. book/author[last()] Последний дочерний элемент внутри каждого элемента в текущем узле контекста. (book/author)[last()] Последний элемент из всего набора элементов дочерних по отношению к элементам в текущем узле контекста.

Группирование С помощью круглых скобок операторы пути доступа можно группировать для уточнения, либо в случае, если для выражения операции не подходит обычный приоритет. Операторы группировки можно использовать в любых выражениях предикатов. – Например: author[(degree or award) and publication]. Их также можно использовать в выражениях шага более высокого уровня. – Например: (book|magazine) или (author/degree | book/award). Их нельзя применять к выражениям шага более низкого уровня. – Например, выражение author/(degree | award) недопустимо.

Примеры группировки операторов пути доступа Выражение Результат (book/author) Все элементы, которые являются дочерними элементами любого элемента из текущего узла контекста. author[(degree or award) and publication] Все элементы, которые содержат хотя бы один элемент или и хотя бы один элемент.

Сравнение сокращенных и полных маршрутов поиска В сокращенном маршруте поиска ось и критерий узла объединены вместе. В полном маршруте они разделяются двумя двоеточиями ::. – Например, сокращенный маршрут состоит из трех шагов. Первый шаг выбирает узлы элементов people по оси дочерних узлов, Второй шаг – выбираются узлы элементов «person» по оси дочерних узлов, Третий шаг – выбираются узлы атрибутов id по оси атрибутов. – Если переписать это выражение в полной форме, тот же маршрут поиска будет выглядеть следующим образом: child::people/child::person/attribute::id.

Сравнение сокращенных и полных маршрутов поиска (2) Полные маршруты поиска, как и сокращенные, могут быть абсолютными, если начинаются с корневого узла. – Например, полная форма/child::people/child::person – эквивалентна сокращенной форме/people/person.

Сравнение сокращенных и полных маршрутов поиска (3) Полные маршруты поиска также могут иметь предикаты. – Например, сокращенный маршрут < 1950]/name[first_name="Алан"] – в полной форме превратится в

Сравнение сокращенных и полных маршрутов поиска (4) В общем случае, полная форма очень многословна и не часто используется на практике. Она не допускается в масках атрибута match в XSLT. Достоинство полных маршрутов: они является единственным способом обращения к большинству осей, по которым выражения XPath позволяют выбирать узлы.

Другие выражения языка XPath Кроме путей доступа на языке XPath могут быть записаны выражения, которые выполняют вычисления и возвращают результат некоторого типа. Например: – 3,141529; – 2+2; – 'Tim Berners-Lee'; – true(); – 32,5

Языке XPath предоставляет возможности для работы с – числовыми данными, – строками и – логическими значениями.

Операции для работы с числовыми данными Для работы с числовыми данными в общих выражений в языке XPath могут использоваться пять обычных арифметических операций: –+ – сложение; –– – вычитание; –* – умножение; –div – деление; –mod – получение остатка.

Строковые данные Язык XPath также предоставляет возможности для работы со строками, которые могут заключаться либо в одинарные (), либо в двойные () кавычки, как вам удобно. Сами кавычки не являются частью строки. Единственное ограничение, которое XPath накладывает на строковый литерал, это то, что он не может содержать тот тип кавычек, который служит в качестве его ограничителя. Если в строке встречаются одинарные кавычки, она должна быть заключена в двойные, и наоборот.

Проверку строк на равенство можно осуществлять с помощью операторов сравнения = и !=. Операторы отношения, = также можно использовать для сравнения строк, однако, если обе строки явно не представляют собой числа (например, –7,5 или 54,2), результат обычно не имеет смысла.

Логические значения Логические значения, которые могут быть равными только true (истина) или false (ложь), обычно создаются в результате сравнения других объектов. В языке XPath имеются операторы – сравнения (=, !=,, >= и

Функции XPath В предикатах путей доступа и в других выражениях языка XPath можно использовать встроенные функции. Функции можно узнать по скобкам после имени функции. При вызове функций им могут передаваться аргументы. В языках XPath 2.0, XQuery 1.0 и XSLT 2.0 используется одинаковый набор функции. Список основных встроенных функций приведен в приложении 1 пособия.

Группировка функций Все функции языка делятся на следующие основные группы: 1. функции для наборов узлов; 2. числовые функции; 3. строковые функции; 4. булевые функции.

Любая функция XPath возвращает значение, относящееся к одному из четырех типов: – набор (последовательность) узлов; – числовое значение; – строка; – логическое значение. Эти типы часто используются в качестве аргументов функции независимо от того, какой тип данных требуется, и процессор (обрабатывающая программа) по возможности выполняет преобразование данных. Если передать булевое значение там, где требуется строка, процессор заменит его одной из строк, true или false. Единственным исключением являются функции, которым требуются наборы узлов. Язык XPath не позволяет преобразовывать строки, булевые или числовые значения в наборы узлов.

Примеры функций для наборов узлов Функции для наборов узлов либо используют, либо возвращают информацию о наборах узлов – упорядоченных последовательностей узлов. К таким функциям относятся: – функция position() – возвращает номер текущего узла в обрабатываемой последовательности; – функция last() возвращает количество узлов в контекстном наборе, которое совпадает с позицией последнего узла набора; – функция count(), которая возвращает количество узлов своего аргумента, а не контекстного списка. Например, count(//name) подсчитывает, сколько элементов name присутствует в документе;

функция id() принимает в качестве аргумента строку, состоящую из одного или более ID, разделенных пробельными символами, и возвращает набор узлов, который содержит все узлы документа, имеющие указанные ID. – Это узлы, атрибуты которых объявлены в DTD как принадлежащие к типу ID, но они не обязательно имеют имя ID или id. Функция id() чаще всего используется в сокращенном синтаксисе XPath. Она позволяет формировать абсолютные маршруты поиска, начинающиеся не от корня. Например, id('p342')/name ссылается на элемент name независимо от его расположения в документе;

функция local-name() принимает в качестве аргумента набор узлов, чаще всего содержащий только один узел, и возвращает локальное имя первого узла набора. – Если аргумент не задается, то в этом случае рассматривается контекстный узел; функция namespace-uri() принимает в качестве аргумента набор узлов и возвращает URI пространства имен для первого узла набора; функция name() принимает в качестве аргумента набор узлов и возвращает полное имя первого узла набора.

Примеры строковых функций XPath включает функции для основных операций со строками, таких как определение длины строки или замена регистра символов. Функция string() преобразует аргумент любого типа в строку. – Логические значения преобразуются в строку true или false. – Наборы узлов преобразуются в строковое значение первого узла набора. – Это значение аналогично значению вычисляемому элементами языка XSLT xsl:value-of.

Примеры строковых функций (2) Строковое значение элемента – это полный текст элемента после разрешения всех ссылок на сущности и отбрасывания тегов, комментариев и инструкций обработки. Числа преобразуются в строки в формате, понятном большинству языков программирования, например «1987», « », « » или «2.998E+10».

функция starts-with() требует двух строковых аргументов. Возвращает true, если строка первого аргумента начинается со строки второго аргумента. Например, starts-with('Ричард', 'Рич') возвращает true, starts-with('Ричард', 'Рик') – false.

функция contains() также принимает два строковых аргумента. – Возвращает true, если строка первого аргумента содержит строку второго, т. е. если второй аргумент является подстрокой первого аргумента, независимо от позиции. Например, contains('Ричард', 'ар') возвращает true, contains('Ричард', 'арт') – false.

функция substring-before() принимает два строковых аргумента и возвращает подстроку первого аргумента, предшествующую первому вхождению строки второго аргумента. – Если вторая строка отсутствует в первой, substring-before() возвращает пустую строку. Например, sub-string-before('MM/DD/YYYY','/') равно 'MM'.

функция substring-after() также принимает два строковых аргумента, но возвращает подстроку первого аргумента, следующую за первым вхождением второго аргумента. – Если вторая строка отсутствует в первой, substring- after() возвращает пустую строку. Например, substring-after('MM/DD/YYYY','/') возвращает 'DD/YYYY', substring-before(substring-after('MM/DD/YYYY','/'),'/') возвращает DD, substring-after(substring-after('MM/DD/YYYY','/'),'/') – YYYY.

функцией substring() принимает три аргумента: – строку, из которой копируется подстрока, – позицию в строке, от которой начинается извлечение, – количество символов, копируемых из подстроки. (может быть опущен, в этом случае подстрока содержит все символы, начиная с указанной стартовой позиции и заканчивая концом строки). – Например, substring('MM/DD/YYYY', 1, 2) возвращает MM; substring('MM/DD/YYYY', 4, 2) возвращает DD; а substring('MM/DD/YYYY', 7) возвращает YYYY. функция string-length() возвращает число, равное длине строкового значения ее аргумента или контекстного узла, если аргумент не указывается.

Примеры булевых функции Булевые функции возвращают логическое значение истина или ложь: функция true() всегда возвращает истину; используется вместо логического литерала true; функция false() всегда возвращает ложь; используется вместо логического литерала false; функция not() преобразует из true в false и наоборот;

Примеры булевых функции (2) функция boolean() преобразует свой единственный аргумент в логическое значение и возвращает результат преобразования. – Если аргумент опущен, преобразуется контекстный узел. – Числа преобразуются в ложь, если они равны нулю; все остальные числа являются истиной. – Наборы узлов ложны, если они пусты, и истинны, если содержат хотя бы один узел. – Строки ложны, если имеют нулевую длину, и истинны – в противном случае. – В соответствии с этим правилом строка false является истинной.

Примеры числовых функций Числовые функции позволяют выполнять действия с числами, как это делается в универсальных языках программирования. Примерами числовых функций являются: Функция number() принимает аргумент любого типа и преобразует его в число. – Если аргумент отсутствует, преобразуется контекстный узел. – Логические значения преобразуются в 1, если истинны, и в 0, если ложны. – Строки преобразуются по возможности наиболее правдоподобным образом. Например, строка «7.5» преобразуется в число 7.5, а строка «8.5E2» – в число Строка «Fred» преобразуется в NaN. – Наборы узлов сначала преобразуются в строку, а затем эта строка результата преобразуется в число. – Если преобразуемый объект невозможно интерпретировать как число, функция number() возвращает значение NaN.

Примеры числовых функций (2) Функция floor(х) принимают в качестве аргумента одно число и возвращает максимальное целое, меньшее или равное своему аргументу. Функция ceiling(х) возвращает наименьшее целое, большее или равное аргументу.

Примеры числовых функций (3) Функция round() возвращает свой аргумент, округленный до ближайшего целого. – При округлении таких чисел, как 1.5 и –3.5, одинаково близких к двум целым числам, round() возвращает наибольшее. Функция sum() требует в качестве аргумента набор узлов. – Она преобразует каждый узел набора в его строковое значение, – затем каждая из этих строк преобразуется в число, и, наконец, складывает эти числа и возвращает их сумму.

Работа с последовательностями В языке XPath 2.0 были добавлены новые выражения для работы с последовательностями, такие, как: – циклы for; – кванторы every и some; – условия if.

Пример XML-документа Pineapplesoft Bookstore XML by Example Applied XML Solutions Huit Solutions Concrètes avec XML et Java Internet Magazine 3.10

Выражение цикла for Выражение for, предназначено для организации цикла по элементам последовательности. Синтаксис цикла for практически аналогичен синтаксису цикла for в языках программирования (например, C#). Например, цикл подсчитывающий общую сумму заказа для каждой строки заказа. for $line in /po:PurchaseOrder/po:OrderLines/po:Line return $line/po:Price * $line/po:Quantity

В данном примере for является ключевым словом, обозначающим, что необходимо перебрать всю последовательность строк и присвоить каждую из них переменной $line. – Для выбора последовательности используется путь доступа: po:PurchaseOrder/po:OrderLines/po:Line. Далее следует ключевое слово return, которое динамически создает последовательность. Затем на каждой итерации цикла к ней добавляется ноль, один или более элементов, после чего последовательность возвращается в качестве результата.

Использование последовательностей в качестве результатов имеет важное значение, потому что это позволяет организовать их дальнейшую обработку при помощи XPath. – Например, можно следующим образом подсчитать общую сумму заказа, передав показанную выше последовательность в функцию sum(). fn:sum(for $line in /po:PurchaseOrder/po:OrderLines/po:Line return $line/po:Price * $line/po:Quantity)

Условный переход if В языке XPath 2.0 также имеется выражение для условного перехода if. – Например: if(/po:PurchaseOrder/po:Seller = 'Bookstore') then 'ok' else 'ko' В данном выражении в зависимости от истинности выражения в скобках, вычисляется либо раздел then, либо раздел else.

Кванторы Кванторы (или квантифицированные выражения – quantified expressions) – это проверки, выполняющиеся над последовательностью в целом. Существуют два квантора, обозначающиеся ключевыми словами every (каждый) и some (какой-то). Различие между циклом и квантором заключается в том, что результатом вычисления цикла является последовательность, результатом вычисления квантора является булевое значение. Значением квантора every является true, если все элементы последовательности удовлетворяют условию. Значение квантор some является истинным, если условие выполняется хотя бы для одного элемента.

Пример использования квантора Например, следующее выражение использует квантор every. every $line in /po:PurchaseOrder/po:OrderLines/po:Line satisfies $line/po:Code Оно состоит из двух частей: – вначале значение последовательности присваивается переменной (аналогично тому, как это делается в цикле), – а затем указывается условие, которому должны удовлетворять элементы последовательности. Результатом вычисления выше приведенного выражения будет false, так как четвертая строка не содержит элемент po:Code. Если же заменить квантор every на some, то результатом будет true, ввиду того, что элемент po:Code содержится как минимум в одной строке.

Выражения над последовательностями можно комбинировать, создавая тем самым сложные запросы. – Например, подсчет общей суммы заказа только по тем строкам, которые включают атрибут кода продукта (po:Code) можно выполнить с помощью следующего выражения: fn:sum(for $line in /po:PurchaseOrder/po:OrderLines/po:Line return if($line/po:Code) then $line/po:Price * $line/po:Quantity else ()) – В выражение цикла for добавлено условное выражение if, которое возвращающее пустую последовательность в том случае, если отсутствия атрибут кода продукта.

Спасибо за внимание!

Пример XML Harry Potter Learning XML Intro. to Databases 39.00

XPath пути к элементам Selects the document root node - / или /. Selects the bookstore element node /bookstore или./bookstore Selects all book element nodes /bookstore/book или //book Selects all price element nodes - bookstore/book/price или //price Selects all lang attribute nodes Selects the document root node././. Selects all the book element nodes Selects the empty

XPath пути к элементам (2) Selects text nodes of all price element nodes //price/text() Select all child nodes of book element nodes /bookstore/book/* Select all comment nodes //comment() Select all nodes except attribute nodes //node() Select all attribute nodes Selects empty set /bookstore/book/text() Select all attribute nodes which are descendant of book element nodes

Selects book element nodes /descendant::book Select all isbn attribute nodes //book/attribute::isbn Select title and price element nodes //book/title | //book/price Selects empty set /child::book Selects the second book element node /bookstore/book/following-sibling::book Select all nodes (except attributes) that are descendants of the bookstore element node /bookstore/node()/descendant-or-self::node() Select all nodes (except attributes) after the first title node

Предикаты [position() op #], [last()] – op: =, !=,, = – test position among siblings [attribute::name op value"] – op: =, !=,, = – test equality of an attribute [axis:nodeSelector] – test pattern

Примеры использования предикатов Selects the first book element that is the child of the bookstore element. /bookstore/book[1] или /bookstore/book[position()=1] Select book element nodes which has a child title element with lang attribute value no equal to eng. /bookstore/book[child::title/attribute::lang!="eng"] Selects the second to last book element /bookstore/book[last()-1] Selects all nodes which have an attr Selects nodes with an attribute named lang or has a child element named price - or child::price] Selects all the title element of all book elements with a price greater than /bookstore/book[price>35.00]/title Select the empty set /bookstore/book[position()>1 and attribute::isbn="111111"] Select the last title element node of all book element nodes /bookstore/book/title[last()]

Упражнение на XPath выражения Задача: найти title и isbn книг, которые не fiction и стоят (цена, price) более чем 50 USD. Harry Potter Learning XML Intro. to Databases Ответ: /bookstore/book[attribute::cat!="fiction" and price>50.00]/title | /bookstore/book[attribute::cat!="fiction" and

Упражнение на XPath выражения Задача: find average price of textbooks. Harry Potter Learning XML Intro. to Databases Ответ: sum(/bookstore/book[attribute::cat="textbook"]/price/number(text())) div count(/bookstore/book[attribute::cat=textbook]/price)

Question: find the titles of textbooks on XML. Harry Potter Learning XML Intro. to Databases Answer: /bookstore/book[attribute::cat="textbook" and contains(title, "XML")]/title/text()

Корневой маршрут Простейшим маршрутом поиска является тот, который указывает на корневой узел документа. Этот маршрут представляет собой просто наклонную черту "/". Например, данный шаблон XSLT использует образец XPath/ для выбора всего дерева входного документа и заключения его в элемент html: Наклонная черта "/" – это абсолютный маршрут поиска, так как независимо от контекстного узла, независимо от того, в каком месте входного документа применен данный шаблон, он всегда обозначает одно и тоже: корневой узел документа.

Маршруты к дочерним элементам Второй простейший маршрут – это одиночное имя элемента. Он позволяет выбрать все дочерние элементы с указанным именем. – Например, выражение XPath profession ссылается на все дочерние элементы «profession» контекстного узла. Точный набор выбираемых элементов зависит от контекстного узла, поэтому это относительный маршрут XPath.

Пример ссылки на дочерние элементы Если контекстным узлом является элемент «person» Алана Тьюринга, тогда маршрут profession будет ссылаться на три дочерних элемента profession: специалист по информатике математик криптограф А если контекстным узлом является элемент «person» Ричарда Фейнмана из того же примера, выражение XPath profession будет ссылаться на единственный его дочерний элемент «profession»: физик Если контекстным узлом является дочерний элемент «name» элемента «person» Ричарда Фейнмана или Алана Тьюринга, тогда данный маршрут XPath не будет ссылаться ни на что, так как ни один из элементов «name» не имеет дочерних элементов «profession».

В XSLT преобразовании контекстным узлом выражения XPath, используемом в атрибуте select элемента xsl:apply-templates и ему подобных, является текущий найденный узел. Когда другие системы, такие как XPointer, используют XPath, для определения контекстного узла предоставляются другие средства.

Пример простой таблицы стилей Рассмотрим шаблон для элемента person. Процессор XSLT дважды активизирует этот шаблон, по одному разу на каждый узел person в документе. – В первый раз контекстным узлом является элемент person Алана Тьюринга. – Во второй раз контекстным узлом становится элемент person Ричарда Фейнмана. При активизации одного и того же шаблона для различных контекстных узлов выражение XPath в каждый раз обращается к разным элементам, и поэтому результаты его работы различаются.

Маршруты к атрибутам Для выбора определенного атрибута элемента, используйте за которым следует имя нужного атрибута. Например, выражение выбирает атрибут «born» контекстного узла. Результат: Алан Тьюринг Ричард М Фейнман

Функции для работы со специальными узлами Для работы текстовыми узлами, комментариями и инструкции обработки используются специальные функции: – text() – для получения значения текстового узла; – comment() – для получения значения комментария; – processing-instruction() – для получения значения инструкции обработки.

Значением узла комментария является текст комментария. Значением узла атрибута – значение атрибута. Значением узла инструкции обработки являются данные инструкции обработки.

Так как узлы комментариев и текстовые узлы не имеют имен, функциям comment() и text() соответствует любой комментарий или текстовый узел, являющийся непосредственным дочерним узлом контекстного узла. Каждый комментарий является отдельным узлом комментария. Каждый текстовый узел содержит максимально возможный непрерывный отрезок текста, не прерванный тегом. Ссылки на сущности и секции CDATA заменяются на текст и разметку и не разбивают текстовые узлы. По умолчанию таблицы стилей XSLT обрабатывают текстовые узлы, но пропускают узлы комментариев. Можно добавить в таблицу стилей XSLT шаблон для комментария, и тогда комментарии также будут обработаны. Следующий шаблон меняет каждый комментарий на текст «Комментарий удален», выделенный курсивом: Комментарий удален

Подстановочные выражения Подстановочные выражения позволяют выбирать несколько типов элементов и узлов одновременно. Существует три подстановочных выражения: – звездочка * – соответствует любому узлу элемента, независимо от его типа. – node() – соответствующее всем узлам: элементов, текста, атрибутов, инструкций обработки, пространств имен и комментариев. – соответствует всем узлам атрибутов..

Подстановочный элемент * Звездочка * соответствует любому узлу элемента, независимо от его типа (но не соответствует атрибутам и комментариям и пр.). Например, следующий шаблон XSLT говорит, что должны быть обработаны дочерние элементы всех элементов, однако никакие данные выводить не требуется: Звездочка не соответствует атрибутам, текстовым узлам, комментариям или узлам инструкций обработки. – Поэтому в приведенном примере выдается информация только из дочерних элементов, у которых есть собственные шаблоны, переопределяющие данный. Перед звездочкой может присутствовать префикс пространства имен. В этом случае выбираются только элементы из указанного пространства имен. – Например, svg:* соответствует всем элементам с тем же URI пространства имен, что и у префикса svg. Как правило, имеет значение именно URI, а не префикс. Префиксы в таблице стилей и исходном документе могут отличаться, но URI пространств имен должны совпадать.

Подстановочный элемент node() node() – это подстановочное выражение, соответствующее, в отличии от *, всем узлам: – элементов, – текста, – атрибутов, – инструкций обработки, – пространств имен и – комментариев.

Подстановочный соответствует всем узлам атрибутов. Например, данный шаблон XSLT копирует значения всех атрибутов элемента person входного документа в элементы attributes выходного документа: К выражению можно добавить префикс пространства имен для выбора атрибутов конкретного пространства имен, подобно тому, как это делается с элементами. – соответствует всем атрибутам XLink, при условии, что префиксу xlink поставлено в соответствие пространство имен И опять имеет значение именно URI, а не фактически используемый префикс.

Составные маршруты поиска Рассмотренные выражения XPath (имена плюс имя атрибута, /) являются одиночными шагами поиска. Эти шаги поиска можно объединять с помощью косой черты, перемещаясь вниз по иерархии от найденного узла к другим узлам. Можно также использовать – точку. для ссылки на текущий узел, – две точки.. для ссылки на родительский узел – двойной слэш // для ссылки на потомков контекстного узла. Символ / объединяет различные шаги в составной маршрут поиска. Каждый шаг в маршруте является относительным по отношению к предшествующему. – Если маршрут начинается с /, первый шаг является относительным по отношению к корневому узлу. – В противном случае он является относительным по отношению к контекстному узлу.

Пример сложного маршрута с помощью наклонной черты Пример: выражение /people/person/name/first_name. – Это выражение начинается с корневого узла, выбирает все дочерние элементы «people» корневого узла, – выбирает все дочерние элементы «person» этих узлов, – затем все дочерние элементы «name» этих узлов – и, наконец, все дочерние элементы «first_name» этих узлов. Применительно к примеру, выражение соответствует следующим двум элементам: Алан Ричард Чтобы выделить только текстовое содержимое этих двух узлов, нужен один шаг. – Например: /people/person/name/first_name/text() выберет из примера строки «Алан» и «Ричард». Оба эти выражения XPath начинаются с /, поэтому они являются абсолютными, начинающимися с корня маршрутами поиска. Относительные маршруты могут отсчитываться от контекстного узла. – Например, выражение XPath выбирает атрибут id дочернего по отношению к контекстному узлу элемента person.

Выбор всех потомков Для выбора всех потомков используется двойная косая черта. Двойная наклонная черта // выбирает всех потомков контекстного узла, а также сам контекстный узел. В начале выражения XPath эти символы позволяют выбрать всех потомков корневого узла. – Например, выражение XPath //name выбирает в документе все элементы name. Выражение выбирает все атрибуты «id» всех элементов, содержащихся в дочернем элементе «person» контекстного узла.

Выбор родительского элемента Родительский элемент можно выбрать с помощью двойной точки. Две точки.. обозначают родителя текущего узла. – Например, выражение XPath относится ко всем атрибутам id в документе: оно выбирает все атрибуты id любого элемента документа. Выражение выбирает все атрибуты id всех элементов, содержащихся в дочернем элементе person контекстного узла. Следовательно, Указывает на все элементы документа, имеющие атрибут id. Выражение //middle_initial/../first_name идентифицирует в документе все элементы first_name, которые являются одноуровневыми для элементов middle_initial. – Применительно к примеру это выражение выбирает Ричард, – но не выбирает Алан.

Выбор текущего элемента с помощью точки Одинарная точка указывает на текущий узел. В XSLT она чаще всего используется, когда требуется получить значение текущего найденного элемента. – Например, данный шаблон копирует содержимое каждого комментария из входного документа в элемент span выходного документа, выделяя его курсивом: Символ. – значение атрибута select элемента xsl:value-of – обозначает найденный элемент. Эта схема одинаково хорошо подходит для узлов элементов, атрибутов и всех других видов узлов. – Например, следующий шаблон выбирает элементы «name» из входного документа и копирует в выходной документ, выделяя их:

Предикаты В общем случае выражение XPath может ссылаться более чем на один узел. Иногда это именно то, что требуется, однако в некоторых случаях приходится просеивать набор узлов, возвращаемый выражением, чтобы выбрать только несколько из них. Каждый шаг в маршруте поиска может иметь предикат, который делает выбор из текущего на данном шаге выражения списка узлов. Предикат содержит логическое выражение, которое проверяется для каждого узла в контекстном списке узлов. Если выражение ложно, этот узел удаляется из списка, в противном случае – сохраняется. – Предположим, например, что требуется найти все элементы «profession», которые имеют значение физик. – Выражение XPath //profession[.="физик"] находит все такие элементы. Здесь точка обозначает строковое значение текущего узла, то есть то же, что возвращает элемент xsl:value-of. Можно использовать одинарные кавычки вместо двойных, когда выражение XPath помещено внутрь значения атрибута, уже находящегося в кавычках. – Например.

Выполнение сравнений Для выбора всех элементов «person», имеющих дочерний элемент «profession» со значением «физик» нужно использовать выражение//person [profession="физик"]. Если требуется найти элемент «person» с «id», равным p4567, то нужно задать перед именем атрибута – Например, в выражении XPath кроме знака равенства поддерживает полный набор операторов сравнения, в том числе, >=,

Использование логических операций XPath также предусматривает логические операторы and и or для логического объединения выражений. – Пример 1: выбрать все элементы person, значения атрибутов born которых находятся между 1910 и 1920 включительно. =1910] – Пример 2: выбрать все элементы name, имеющие дочерние элементы first_name со значением Ричард или Дик. //name[first_name="Ричард" or first_name="Дик"]

Выражение XPath //name выбирает все элементы «name». Выражение //name[middle_initial] выбирает все элементы «name» и затем проверяет каждый из них на наличие дочернего элемента middle_initial. Сохраняются только те элементы, в которых есть такой дочерний элемент. – Например, //name[middle_initial] выберет элемент «name» Ричарда М. Фейнмана, но не выберет «name» Алана Тьюринга. Любой или все шаги в маршруте поиска могут иметь предикаты. – Например, выражение < 1950]/name[first_name="Алан"] – сначала выбирает все дочерние элементы people корневого узла (в примере такой только один). – Затем он выбирает из этих элементов все элементы person, атрибуты born которых имеют числовое значение меньше – И наконец, из этой группы элементов отбираются все дочерние элементы name, у которых дочерний элемент first_name имеет значение Алан.

Полные маршруты поиска Ранее рассмотренные маршруты называются «сокращенными маршрутами поиска». Именно они лучше всего подходят для масок поиска XSLT. В XPath также определен полный синтаксис для полных маршрутов поиска, который более многословен и более гибок. Каждый шаг в маршруте поиска имеет – обязательные части ось поиска критерий узла, – необязательная часть предикаты. Ось указывает направление перемещения от контекстного узла для поиска следующих узлов. Критерий узла определяет, какие узлы по этой оси следует включать. Предикаты дополнительно отсеивают узлы в соответствии с указанным в предикате выражением.

Оси поиска В языке XPath понятие оси служит для того, чтобы выделить в дереве документа различные подмножества узлов относительно некоторого узла, называемого контекстным. В общем случае эти подмножества пересекаются, но оси ancestor, descendant, following, preceding и self разбивают документ на непересекающиеся части, в совокупности содержащие все узлы (за исключением тех, что соответствуют пространствам имен и атрибутам). Контекстный узел устанавливается языком, в который погружен XPath. В случае XSLT контекстный узел устанавливают следующие конструкции: – сопоставление с шаблоном … ; – оператор xsl:for-each; – оператор xsl:apply-templates.

Оси сокращенного синтаксиса Сокращенный синтаксис позволяет перемещаться по следующим осям: – ось дочерних узлов (child), – ось родительских узлов (parent), – собственная оси (self), – ось атрибутов (attribute) и – оси потомков с включением контекстного узла (descendant-or-self).

Дополнительные оси полного синтаксиса Полный синтаксис добавляет еще восемь осей: 1. Ось предков (ancestor) - Все узлы элементов, содержащие контекстный узел; родительский узел, родитель родителя, родитель родителя родителя и т.д. вверх вплоть до корневого узла в порядке, обратном расположению узлов в документе. 2. Ось следующих одноуровневых узлов (following-sibling) - Все узлы, следующие за контекстным узлом и содержащиеся в том же узле родительского элемента, в том же порядке, в каком узлы присутствуют в документе. 3. Ось предыдущих одноуровневых узлов (preceding-sibling) - Все узлы, предшествующие контекстному узлу и содержащиеся в том же узле родительского элемента, в порядке, обратном порядку в документе. 4. Ось следующих узлов (following) - Все узлы, следующие после контекстного узла, в том же порядке, в каком узлы присутствуют в документе. 5. Ось предыдущих узлов (preceding) - Все узлы, предшествующие началу контекстного узла, в порядке, обратном порядку в документе. 6. Ось пространств имен (namespace) - Все пространства имен в области действия контекстного узла, объявленные либо в контекстном узле, либо в одном из его предков. 7. Ось потомков (descendant) - Все потомки контекстного узла, исключая сам контекстный узел. 8. Ось предков, включая контекстный узел (ancestor-or-self) - Все предки контекстного узла, включая сам контекстный узел.

Пример XSLT преобразования с использованием полный синтаксиса

Пояснение примера Первый шаблон соответствует корневому узлу. – Он применяет шаблоны ко всем потомкам корневого узла, являющимся элементами person, то есть перемещается от корневого узла по оси потомков (descendant) с критерием узла person. Второй шаблон соответствует элементам person. – Он помещает дочерние элементы name каждого элемента person в элемент dt. – (Использованный здесь маршрут поиска, child::name, может быть переписан и в сокращенной форме – в виде одного слова name.) – Далее шаблоны применяются ко всем элементам, следующим за элементом name на том же уровне иерархии. – Шаблон начинает обработку с контекстного узла person, затем перемещается по оси дочерних элементов в поисках элемента name. – Отсюда процессор перемещается по оси следующих одноуровневых узлов (following-sibling) и ищет элементы любого типа (*) после элемента name, также являющиеся дочерними для того же элемента person. – Для оси following-sibling не существует сокращенного эквивалента, и потому это действительно простейший способ написания данной конструкции.

Пояснение примера (2) Третий шаблон – выбирает любые элементы, не подходящие для других шаблонов; он просто помещает такие элементы в элемент li. – Выражение XPath self::* выбирает значение текущего найденного элемента, то есть контекстного узла. – Это выражение можно сократить до символа «точка». Четвертый (последний) шаблон – выбирает элементы homepage. – В этом случае требуется выбрать значение атрибута xlink:href, поэтому от контекстного узла homepage мы перемещаемся по оси атрибутов. – Критерий узлов выбирает атрибуты xlink:href. – Точнее, он ищет атрибут с локальным именем href, префиксу которого поставлено в соответствие URI пространства имен