Слайд 1Языки описания информации
Лекция 4.
Кафедра «ОСУ»
Весенний семестр 2010/2011 уч. года
XPath
Слайд 2Описание взаимосвязи между XML-документами
Языки разметки описывают информацию, одним из свойств которой
является сильная связанность.
Содержание одного XML-документа может быть связано с содержанием большого количества других XML-документов.
При этом разные документы могут размещаться на разных узлах компьютерной сети.
Таким образом множество XML-документов может образовывать сложную сеть документов, описывающих информацию об окружающем мире.
Широко известным примером такой сети является World Wide Web (Web-сеть), которая содержит множество связанных между собой HTML-документов (web-страниц) расположенных на разных компьютерах Интернет сети.
Слайд 3Языки взаимосвязи между документами
Для описания взаимосвязей между документами разработан набор языков,
таких, как XPath, XPointer и XLink.
Эти языки используются совместно и каждый из них имеет свое назначение:
язык XPath предназначен для идентификации отдельных частей XML-документа, чтобы можно было на них ссылаться;
язык XPointer используется для описания ссылок из одного XML-документа на некоторую часть другого XML-документа, который расположен в локальной или глобальной компьютерной сети; для составления ссылок используются выражения на языке XPath;
язык XLink предназначен для встраивания в XML-документы ссылок на другие XML-документы (при этом используется язык XPointer).
Слайд 4
Эти языки предоставляют возможность связывания XML-документов.
То, как эти связи (ссылки) реально
используются, зависит от программ, обрабатывающих эти XML-документы (XML-процессоров).
Слайд 5Язык XPath
(XML Path Language)
Слайд 6Язык XPath
Язык XPath используется для идентификации различных частей XML документов.
Язык
XPath использует синтаксис отличный от XML синтаксиса.
XPath позволяет писать выражения, ссылающиеся на
первый элемент «person»,
седьмой дочерний элемент третьего элемента «person»,
атрибут ID первого элемента «person», содержащий строку «Фред Джоунс»,
все инструкции обработки xml-stylesheet в прологе документа и т. д.
С помощью выражений на языке XPath можно задавать узлы:
по положению,
по относительному положению,
по типу,
по содержимому
и другим критериям.
В выражениях XPath могут также использоваться числа, строки, логические операции.
Это позволяет в таблицах стилей XSLT выполнять простейшие арифметические вычисления для нумерации и создания перекрестных ссылок.
Строковые операции в XPath позволяют XSLT выполнять такие задачи, как перевод заголовка главы в верхний регистр в шапке при сохранении смешанного регистра в ссылке в основном тексте.
Слайд 7Язык XPath
Язык XML Path Language (XPath) предназначен для описания указателей (или
поисковых запросов) на части XML-документов.
Он использует синтаксис, отличный от синтаксиса языка XML.
С его помощью можно записывать выражения, ссылающиеся на некоторый конкретный элемент или на группу элементов XML-документа.
XPath позволяет задавать части документа (элементы, атрибуты, комментарии и т.п.) по их абсолютному или относительному положению в документе, а также на основе их типа, их содержимого или других критериев.
В настоящее время есть две стандартизированные организацией W3C версии языка XPath: 1.0 и 2.0.
Слайд 8XPath Versions
XPath 1.0 became a W3C Recommendation November 16, 1999.
XPath 2.0
became a W3C Recommendation January 23, 2007.
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
Слайд 9Использование языка XPath
Описания частей XML-документов с помощью языка XPath могут использоваться
с разными целями:
на языке XPointer для задании адресов, которые указывают на определенную точку или часть XML-документа, которые используются в ссылках языка XLink;
на языке XSLT для отбора (в качестве шаблона правил) определенных элементов входного документа для их обработки или копирования в выходной документ;
на языках XSLT и XQuery запросов для выборки требуемых данных из XML-документов.
Слайд 10Иерархическая структура
XML- документа
Языка XPath рассматривает XML-документ, как иерархическую структуру (дерево),
состоящую из узлов, следующих семи типов:
узел документа – включает весь XML-документ, помимо корневого элемента также и комментарии, записанные вне его;
узлы элементов – включают элементы документа (начиная с открыввающего тэга и заканчивая закрывающим тэгом);
узлы атрибутов – пара «имя_атрибута=значение_атрибута»;
текстовые узлы – текстовое содержание элементов и атрибутов;
узлы пространств имен;
узлы инструкций обработки;
узлы комментариев.
Слайд 11
Вэтом списке нет таких конструкций, как секции CDATA, ссылки на сущности
и объявления типа документа.
XPath работает с XML-документом уже после того, как эти конструкции уже объединены с документом.
Некоторые узлы могут содержать другие узлы.
Узел документа, в конечном счете, включает в себя все остальные узлы.
Язык XPath позволяет идентифицировать (выбирать) узлы и наборы узлов этого иерархического дерева документа.
Слайд 12Древовидная структура XML документа
XML документ представляет собой дерево, состоящее из узлов.
Некоторые узлы могут содержать другие узлы.
Один корневой узел в конечном счете включает в себя все остальные узлы.
XPath – это язык для выбора узлов и наборов узлов этого дерева.
С точки зрения XPath существует семь типов узлов:
Корневой узел
Узлы элементов
Текстовые узлы
Узлы атрибутов
Узлы комментариев
Узлы инструкций обработки
Узлы пространств имен
Слайд 13Особенности модели данных XPath
Корневой узел не совпадает с корневым элементом.
Корневой узел
дерева содержит в себе весь документ, в том числе корневой элемент, а также комментарии и инструкции обработки, находящиеся перед начальным тегом корневого элемента или после конечного тега корневого элемента.
В приведенном примере корневой узел содержит инструкцию обработки xml-stylesheet и корневой элемент people.
Модель данных XPath включает не все, что есть в документе.
В частности, XML-объявление и DTD не доступны через XPath.
Однако, если DTD предоставляет значения по умолчанию для каких-либо атрибутов, XPath распознает эти атрибуты.
Например, элемент homepage имеет атрибут xlink:type, предоставляемый DTD.
Разрешаются все ссылки на анализируемые сущности.
Слайд 14Пример XML документа
#FIXED "simple”
xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink">
]>
Алан Тьюринг
специалист по информатике
математик
криптограф
Ричард M Фейнман
физик
Игра на бонгах
Слайд 15Древовидная структура XML документа
Слайд 16Взаимосвязи между узлами
Parent (родитель) – узел «родителя» содержит под-узлы «ребенка».
Children (ребенок)
Siblings
(братья) – под-узлы имеющие одного «родителя».
Descendants (потомки) – все под-узлы ниже по иерархии текущего узла.
Ancestors (предки) – все под-узлы выше по иерархии текущего узла.
Слайд 17Parent (родитель)
Каждый элемент и атрибут имеет одного «родителя»
Например:
Harry Potter
J K. Rowling 2005 29.99Элемент “book” является родителем узлов: title, author, year и price.
Слайд 18Children (ребенок)
Элемент может не иметь, либо иметь одного или несколько «детей»
(children).
Например:
Harry Potter
J K. Rowling
2005
29.99
Элементы title, author, year и price являются «детьми» (children) элемента book.
Слайд 19Siblings (братья)
Узлы, которые имеют одного и того же «родителя» (parent).
Например:
Harry
Potter
J K. Rowling 2005 29.99 Все элементы title, author, year и price являются «братьями» (siblings).
Слайд 20Ancestors (предки)
Узлы «родители», их «родители» и т.д.
Например:
Harry Potter
J K.
Rowling
2005 29.99 предками элемента title являются элементы book bookstore.
Слайд 21Descendants (потомки)
Узлы «ребенок», их «дети» и т.п.
Например:
Harry Potter
J K.
Rowling
2005 29.99 потомками элемента bookstore являются элементы: book, title, author, year и price.
Слайд 22Пути доступа
На языке XPath можно записывать разные виды выражений.
Наиболее часто используемым
выражением языка XPath является путь доступа (маршрутом поиска или path-выражением).
Путь доступа задает шаблон для отбора узлов XML-документа.
Выбираемая с помощью пути доступа последовательность узлов может быть пустой, содержать один узел или множество узлов.
Можно отметить, что пути доступа во многом сходны с путями к файлам, которые используются в файловых системах для указания местонахождения файла или папки.
Слайд 23Контекст
Важным понятием при рассмотрении путей доступа является контекст.
Контекст – это
некая точка отсчета, относительно которой записывается путь доступа.
Контекст может включать набор узлов, а также узел, который называется текущим узлом.
Изменение контекста, а также текущего узла, выполняется программой, которая обрабатывает XML-документ (например, XSLT-процессор, программа пользователя).
Слайд 24Виды путей доступа
В языке XPath имеются два вида путей доступа:
абсолютный путь
– он начинается от корневого узла дерева документа (запись такого пути начинается со слэша);
относительный путь – он начинается с текущего (контекстного) узла дерева документа.
Слайд 25
Каждый путь записывается в виде набора шагов, разделенных слэшем (/).
Каждый
шаг это правило выбора узлов из результата (последовательности) полученной на предыдущем шаге.
Например запрос ‘books/book/name’, проходит по иерархии документа вплоть до элемента .
Результатом является последовательность элементов типа name.
Слайд 27
В полной форме, каждый шаг пути состоит из трех частей:
axis::nodetest[predicate]
где
axis – ось – направление перемещения по иерархической структуре;
nodetest – критерий выбора узлов;
predicate – предикат –дальнейшее уточнение списка узлов-кандидатов.
Слайд 28Оси
axis – ось, определяет направление перемещения по иерархической структуре между узлом
контекста и узлами, которые будут проверяться на данном шаге доступа.
Ось задает общее направление, в котором выполняется шаг доступа по отношению к узлу контекста.
Если ось не задана (при краткой записи пути доступа), то по умолчанию предполагается, что перемещение выполняется по оси дочерних элементов «child::».
Слайд 29Критерий узлов
nodetest – критерий узлов, определяет
тип узлов,
либо развернутое имя
узлов (шаблон),
которые будут выбираться на данном шаге доступа.
В первую очередь проверка узла определяет, какие из всех узлов на указанной оси являются кандидатами,
потенциально подходящими узлами для шага доступа.
Слайд 30Предикат
predicate – предикат, задает условие (фильтр), которое должно выполняться для дальнейшего
уточнения списка узлов-кандидатов.
Если для рассматриваемого кандидата условие заданное предикатом выполняется то он отбирается в текущий контекст.
Если предикат не задается, то квадратные скобки ([ ]) не пишутся.
Слайд 31Анализ пути доступа
Анализ пути доступа выполняется слева направо.
Если в
пути доступа первым символом является слэш (/), то путь адресации считается абсолютным, то есть начинается с узла документа.
В этом случае за узел контекста на первом шаге берется узел документа.
Контекст – это некая точка отсчета, относительно которой рассчитывается следующий шаг адресации.
Поэтому на каждом шаге адресации получается новая последовательность узлов обрабатываемого документа, которая становится контекстом для следующего шага адресации.
Слайд 32
Для лучшего понимания концепции контекста нужно представить дерево, содержащее узлы.
Запрос
всех узлов X из корня дерева возвратит один набор результатов, в то время, как запрос таких же узлов из ветви дерева возвратит другой набор результатов.
Результат выражения зависит от контекста, к которому оно обращается при выполнении.
Слайд 35Краткая форма записи путей доступа
В краткой форме записи путей доступа оси
не указываются.
В основном используется оператор «дочерний элемент», который выбирает непосредственные дочерние элементы последовательности, указанной слева. (т.е. используется ось child::).
Например:
путь доступа author/first-name выделяет все элементы
внутри элемента текущего узла контекста.
Слайд 36
Таким образом краткая форма записи путей доступа позволяет перемещаться по следующим
осям:
оси дочерних узлов (child),
оси родительских узлов (parent),
собственной оси (self),
оси атрибутов (attribute) и
оси потомков с включением контекстного узла (descendant-or-self).
Слайд 37Операторы, используемые для описания путей доступа
Слайд 38Операторы, используемые для описания выражений языка XPath
Данная таблица не включает логические
операторы и операторы над множествами, которые будут рассмотрены далее.
Слайд 39Приоритеты операций путей доступа
Слайд 40Список специальных символов записи пути доступа
Слайд 41Текущий контекст
Выражение с префиксом в виде точки и косой черты (./)
явным образом указывает на использование текущего контекста.
Например, выражение ‘./author’ ссылается на все элементы
внутри текущего контекста.
Однако, следует запомнить, что это выражение эквивалентно следующей краткой записи пути доступа: author.
Слайд 42Корневой элемент
Выражение, использующее косую черту и звездочку (/*), использует в качестве
контекста корневой элемент.
Например, выражение ‘/*’ находит корневой элемент документа.
Слайд 43Рекурсивный спуск
Выражение, использующее двойную косую черту (//), указывает на поиск, по
всем нижележащим уровням иерархии.
Если двойная косая черта (//) в начале задается, то поиск выполняется с корневого элемента (он является контекстом поиска).
Например, путь ‘//author’ ссылается на все элементы
внутри в любом месте внутри текущего документа.
Слайд 44Конкретные элементы
Выражение, которое начинается с имени элемента, ссылается на запрос конкретного
элемента, который начинается от текущего узла контекста.
Например, путь доступа ‘bookstore/book’ ссылается на последовательность элементов внутри элементов в текущего узле контекста.
Слайд 45Использование операторов пути
С помощью операторов пути (/ и //) описываются последовательности
элементов требуемого типа.
принимают в качестве аргументов последовательность «с левой стороны», из которой производится выбор,
и критерий узлов «с правой стороны» как инструкцию, указывающую, какие элементы нужно выбирать.
Оператор «дочерний элемент» (/) производит выбор из непосредственных дочерних элементов левой последовательности,
Оператор «потомок» (//) производит выбор из всех потомков последовательности с левой стороны.
Оператор // можно рассматривать как подстановку для одного или нескольких уровней иерархии.
Слайд 46
Операторы пути изменяют контекст по мере выполнения запроса.
Последовательно соединяя несколько
операторов пути, пользователи могут выполнять обход всего дерева документа.
Слайд 47Примеры использования операторов путей доступа
Слайд 48Предикаты
Каждый шаг в пути доступа может иметь предикат, который делает выбор
из текущего на данном шаге выражения списка узлов.
Предикат содержит логическое выражение, которое проверяется для каждого узла в контекстном списке узлов.
Если выражение истинно, то этот узел включается в последовательность, в противном случае – не включается.
Слайд 49Примеры использования предикатов
Если требуется найти все элементы profession, которые имеют значение
«физик», то можно использовать следующее выражение //profession[.="физик"].
Здесь точка обозначает строковое значение текущего узла.
Выражение //person [profession="физик"] позволяет выбирать все элементы person, имеющих дочерний элемент profession со значением «физик».
Для выбора элементов person с id, равным p4567, то нужно поместите перед именем атрибута символ @, как, например, в выражении //person[@id="p4567"].
Слайд 50
Выражение //name[middle_initial] будет выбирать все элементы name, а затем будет проверяет
каждый из них на наличие дочернего элемента middle_initial.
Сохраняются только те элементы, в которых есть такой дочерний элемент.
Слайд 51
В языке XPath кроме знака равенства поддерживает полный набор операторов сравнения,
в том числе <, >, >=, <= и !=.
Например, выражение //person[@born<=1976] ищет в документе все элементы person с атрибутом born, числовое значение которого меньше или равно 1976.
Следует помнить, что если < или <= используются внутри XML-документа, необходимо заменять знак «меньше» на <
например "//person[@born <= 1976]".
Слайд 52Логические операторы
В языке XPath также имеются логические операторы and и or
для логического объединения выражений.
Например, выражение XPath //person[@born<=1920 and @born>=1910] выбирает все элементы person, значения атрибутов born которых находятся между 1910 и 1920 включительно.
Выражение //name[first_name="Ричард" or first_name="Дик"] выбирает все элементы name, имеющие дочерние элементы first_name со значением Ричард или Дик.
Слайд 53Примеры использования предикатов в путях доступа
Слайд 54Примеры использования предикатов в путях доступа (2)
Слайд 55Символ подстановки
Элементы или атрибуты могут использоваться, без указания их имени, с
помощью символа подстановки (*).
Данный символ обозначает все элементы, являющиеся дочерними для текущего контекста, независимо от имени тега.
Слайд 56Примеры использования символа подстановки в путях доступа
Слайд 57Работа с атрибутами
В XPath имена атрибутов задаются с помощью символом @,
за которым следует имя нужного атрибута.
Атрибуты и дочерние элементы обрабатываются одинаково, и эти два типа считаются эквивалентными везде, где это возможно.
Например, выражение XPath @born выбирает атрибут born контекстного узла.
К атрибутам нельзя применять индексы, поскольку их порядок по определению считается не заданным.
Слайд 59Работа с комментариями и текстовым содержанием
Так как узлы комментариев и текстовые
узлы не имеют имен, то для их задания в пути доступа используются следующие функции
comment() соответствует узлам комментарий, являющиеся непосредственным дочерним узлом контекстного узла;
text() соответствуют узлам текста, являющиеся непосредственным дочерним узлом контекстного узла.
Каждый комментарий является отдельным узлом комментария.
Каждый текстовый узел содержит максимально возможный непрерывный отрезок текста, не прерванный тегом.
Слайд 60Работа инструкциями обработки
Функция processing-instruction() без аргументов выбирает все дочерние инструкции обработки
контекстного узла.
Если аргумент указан, она выбирает только дочерние инструкции обработки, имеющие данную цель.
Например, выражение processing-instruction('xml-styles-heet') выбирает все дочерние инструкции обработки контекстного узла, целью которых является xml-stylesheet.
Слайд 61Последовательности языка XPath
Пути доступа возвращают последовательности, в которых сохраняется порядок следования
элементов (а также атрибуты и значения) заданных в обрабатываемом документе.
Слайд 62Индексирование в последовательности
Выражения XPath позволяют легко получать конкретный узел в последовательности.
Для этого нужно задать порядковый номер индекса в квадратных скобках (т.е. индексы относятся к фильтру).
Первый элемент последовательности имеет номер 1 (хотя некоторые процессоры используют 0 для указания на первый элемент последовательности).
Как пояснялось ранее, операция [ ] имеют более высокий приоритет, чем операции / и //.
Атрибуты по определению являются неупорядоченными, поэтому для них нельзя использовать индексы.
Слайд 63Примеры выбора элементов последовательности
Слайд 64Примеры выбора элементов последовательности
Слайд 65Примеры выбора элементов последовательности
Фрагмент XML-документа:
Слайд 66
Приведенные в табл. примеры являются краткими записями путей доступа, в которых
используется неявно ось “child::”.
Например, путь доступа: “x/y[1]” эквивалентен пути “x/child::y[1]”.
Оба выражения означают «для каждого элемента выбирать первый дочерний элемент с именем .
Для этой оси последовательность дочерних элементов индексируется в прямом порядке документа.
Слайд 67
Для других осей, например “ancestor::”, в полном пути доступа следует явно
указать имя оси.
Для данной оси последовательность предков индексируется в обратном порядке документа.
Например, путь доступа “x/ancestor::y[1]” – выбирает для каждого элемента первого его предка (в обратном порядке документа) с именем .
Синтаксис такой же, но порядок обратный.
Слайд 68Поиск последнего элемента в последовательности
Функция last() возвращает значение true для последнего
элемента в последовательности.
Следует обратить внимание, что функция last() относится к родительскому узлу.
Примеры выбора последнего элемента последовательности приведены в табл.
Слайд 69Группирование
С помощью круглых скобок операторы пути доступа можно группировать для уточнения,
либо в случае, если для выражения операции не подходит обычный приоритет.
Операторы группировки можно использовать в любых выражениях предикатов.
Например: author[(degree or award) and publication].
Их также можно использовать в выражениях шага более высокого уровня.
Например: (book|magazine) или (author/degree | book/award).
Их нельзя применять к выражениям шага более низкого уровня.
Например, выражение author/(degree | award) недопустимо.
Слайд 70Примеры группировки операторов пути доступа
Слайд 71Сравнение сокращенных и полных маршрутов поиска
В сокращенном маршруте поиска ось и
критерий узла объединены вместе.
В полном маршруте они разделяются двумя двоеточиями “::”.
Например, сокращенный маршрут поиска “people/person/@id” состоит из трех шагов.
Первый шаг выбирает узлы элементов people по оси дочерних узлов,
Второй шаг – выбираются узлы элементов «person» по оси дочерних узлов,
Третий шаг – выбираются узлы атрибутов id по оси атрибутов.
Если переписать это выражение в полной форме, тот же маршрут поиска будет выглядеть следующим образом:
“child::people/child::person/attribute::id”.
Слайд 72Сравнение сокращенных и полных маршрутов поиска (2)
Полные маршруты поиска, как и
сокращенные, могут быть абсолютными, если начинаются с корневого узла.
Например, полная форма “/child::people/child::person”
эквивалентна сокращенной форме “/people/person”.
Слайд 73Сравнение сокращенных и полных маршрутов поиска (3)
Полные маршруты поиска также могут
иметь предикаты.
Например, сокращенный маршрут
“/people/person[@born < 1950]/name[first_name="Алан"]”
в полной форме превратится в
“/child::people/child::person[@born<1950]/child::name[first_name="Алан"]”
Слайд 74Сравнение сокращенных и полных маршрутов поиска (4)
В общем случае, полная форма
очень многословна и не часто используется на практике.
Она не допускается в масках атрибута match в XSLT.
Достоинство полных маршрутов: они является единственным способом обращения к большинству осей, по которым выражения XPath позволяют выбирать узлы.
Слайд 75Другие выражения языка XPath
Кроме путей доступа на языке XPath могут быть
записаны выражения, которые выполняют вычисления и возвращают результат некоторого типа.
Например:
3,141529;
2+2;
'Tim Berners-Lee';
true();
32,5<76,2E-21;
position()=last().
Выражения такого вида могут включаться в предикаты путей доступа или использоваться самостоятельно.
Слайд 76
Языке XPath предоставляет возможности для работы с
числовыми данными,
строками и
логическими значениями.
Слайд 77Операции для работы с числовыми данными
Для работы с числовыми данными в
общих выражений в языке XPath могут использоваться пять обычных арифметических операций:
“+” – сложение;
“–” – вычитание;
“*” – умножение;
“div” – деление;
“mod” – получение остатка.
Слайд 78Строковые данные
Язык XPath также предоставляет возможности для работы со строками ,
которые могут заключаться либо в одинарные (‘), либо в двойные (“) кавычки, как вам удобно.
Сами кавычки не являются частью строки.
Единственное ограничение, которое XPath накладывает на строковый литерал, это то, что он не может содержать тот тип кавычек, который служит в качестве его ограничителя.
Если в строке встречаются одинарные кавычки, она должна быть заключена в двойные, и наоборот.
Слайд 79
Проверку строк на равенство можно осуществлять с помощью операторов сравнения =
и !=.
Операторы отношения <, >, <= и >= также можно использовать для сравнения строк, однако, если обе строки явно не представляют собой числа (например, –7,5 или 54,2), результат обычно не имеет смысла.
Слайд 80Логические значения
Логические значения, которые могут быть равными только true (истина) или
false (ложь), обычно создаются в результате сравнения других объектов.
В языке XPath имеются операторы
сравнения (=, !=, <, >, >= и <=),
логические операторы (and и or).
Логические значения часто используются в предикатах путей доступа.
Например, в пути доступа //person[profession="физик"] логическим выражением является profession="физик".
Слайд 81Функции XPath
В предикатах путей доступа и в других выражениях языка XPath
можно использовать встроенные функции.
Функции можно узнать по скобкам после имени функции.
При вызове функций им могут передаваться аргументы.
В языках XPath 2.0, XQuery 1.0 и XSLT 2.0 используется одинаковый набор функции.
Список основных встроенных функций приведен в приложении 1 пособия.
Слайд 82Группировка функций
Все функции языка делятся на следующие основные группы:
функции для наборов
узлов;
числовые функции;
строковые функции;
булевые функции.
Слайд 83
Любая функция XPath возвращает значение, относящееся к одному из четырех типов:
набор (последовательность) узлов;
числовое значение;
строка;
логическое значение.
Эти типы часто используются в качестве аргументов функции независимо от того, какой тип данных требуется, и процессор (обрабатывающая программа) по возможности выполняет преобразование данных.
Если передать булевое значение там, где требуется строка, процессор заменит его одной из строк, true или false.
Единственным исключением являются функции, которым требуются наборы узлов.
Язык XPath не позволяет преобразовывать строки, булевые или числовые значения в наборы узлов.
Слайд 84Примеры функций для наборов узлов
Функции для наборов узлов либо используют, либо
возвращают информацию о наборах узлов – упорядоченных последовательностей узлов.
К таким функциям относятся:
функция position() – возвращает номер текущего узла в обрабатываемой последовательности;
функция last() возвращает количество узлов в контекстном наборе, которое совпадает с позицией последнего узла набора;
функция count(), которая возвращает количество узлов своего аргумента, а не контекстного списка.
Например, count(//name) подсчитывает, сколько элементов name присутствует в документе;
Слайд 85
функция id() принимает в качестве аргумента строку, состоящую из одного или
более ID, разделенных пробельными символами, и возвращает набор узлов, который содержит все узлы документа, имеющие указанные ID.
Это узлы, атрибуты которых объявлены в DTD как принадлежащие к типу ID, но они не обязательно имеют имя ID или id.
Функция id() чаще всего используется в сокращенном синтаксисе XPath. Она позволяет формировать абсолютные маршруты поиска, начинающиеся не от корня.
Например, id('p342')/name ссылается на элемент name независимо от его расположения в документе;
Слайд 86
функция local-name() принимает в качестве аргумента набор узлов, чаще всего содержащий
только один узел, и возвращает локальное имя первого узла набора.
Если аргумент не задается, то в этом случае рассматривается контекстный узел;
функция namespace-uri() принимает в качестве аргумента набор узлов и возвращает URI пространства имен для первого узла набора;
функция name() принимает в качестве аргумента набор узлов и возвращает полное имя первого узла набора.
Слайд 87Примеры строковых функций
XPath включает функции для основных операций со строками, таких
как определение длины строки или замена регистра символов.
Функция string() преобразует аргумент любого типа в строку.
Логические значения преобразуются в строку true или false.
Наборы узлов преобразуются в строковое значение первого узла набора.
Это значение аналогично значению вычисляемому элементами языка XSLT xsl:value-of.
Слайд 88Примеры строковых функций (2)
Строковое значение элемента – это полный текст элемента
после разрешения всех ссылок на сущности и отбрасывания тегов, комментариев и инструкций обработки.
Числа преобразуются в строки в формате, понятном большинству языков программирования, например «1987», «299792500», «2.71828» или «2.998E+10».
Слайд 89
функция starts-with() требует двух строковых аргументов. Возвращает true, если строка первого
аргумента начинается со строки второго аргумента.
Например,
starts-with('Ричард', 'Рич') возвращает true,
starts-with('Ричард', 'Рик') – false.
Слайд 90
функция contains() также принимает два строковых аргумента.
Возвращает true, если строка
первого аргумента содержит строку второго, т. е. если второй аргумент является подстрокой первого аргумента, независимо от позиции.
Например,
contains('Ричард', 'ар') возвращает true,
contains('Ричард', 'арт') – false.
Слайд 91
функция substring-before() принимает два строковых аргумента и возвращает подстроку первого аргумента,
предшествующую первому вхождению строки второго аргумента.
Если вторая строка отсутствует в первой,
substring-before() возвращает пустую строку.
Например,
sub-string-before('MM/DD/YYYY','/') равно 'MM'.
Слайд 92
функция 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.
Слайд 93
функцией substring() принимает три аргумента:
строку, из которой копируется подстрока,
позицию
в строке, от которой начинается извлечение,
количество символов, копируемых из подстроки. (может быть опущен, в этом случае подстрока содержит все символы, начиная с указанной стартовой позиции и заканчивая концом строки).
Например, substring('MM/DD/YYYY', 1, 2) возвращает MM; substring('MM/DD/YYYY', 4, 2) возвращает DD; а substring('MM/DD/YYYY', 7) возвращает YYYY.
функция string-length() возвращает число, равное длине строкового значения ее аргумента или контекстного узла, если аргумент не указывается.
Слайд 94Примеры булевых функции
Булевые функции возвращают логическое значение истина или ложь:
функция true()
всегда возвращает истину; используется вместо логического литерала true;
функция false() всегда возвращает ложь; используется вместо логического литерала false;
функция not() преобразует из true в false и наоборот;
Слайд 95Примеры булевых функции (2)
функция boolean() преобразует свой единственный аргумент в логическое
значение и возвращает результат преобразования.
Если аргумент опущен, преобразуется контекстный узел.
Числа преобразуются в ложь, если они равны нулю; все остальные числа являются истиной.
Наборы узлов ложны, если они пусты, и истинны, если содержат хотя бы один узел.
Строки ложны, если имеют нулевую длину, и истинны – в противном случае.
В соответствии с этим правилом строка “false” является истинной.
Слайд 96Примеры числовых функций
Числовые функции позволяют выполнять действия с числами, как это
делается в универсальных языках программирования.
Примерами числовых функций являются:
Функция number() принимает аргумент любого типа и преобразует его в число.
Если аргумент отсутствует, преобразуется контекстный узел.
Логические значения преобразуются в 1, если истинны, и в 0, если ложны.
Строки преобразуются по возможности наиболее правдоподобным образом.
Например, строка «7.5» преобразуется в число 7.5, а строка «8.5E2» – в число 8500.
Строка «Fred» преобразуется в NaN.
Наборы узлов сначала преобразуются в строку, а затем эта строка результата преобразуется в число.
Если преобразуемый объект невозможно интерпретировать как число, функция number() возвращает значение NaN.
Слайд 97Примеры числовых функций (2)
Функция floor(х) принимают в качестве аргумента одно число
и возвращает максимальное целое, меньшее или равное своему аргументу.
Функция ceiling(х) возвращает наименьшее целое, большее или равное аргументу.
Слайд 98Примеры числовых функций (3)
Функция round() возвращает свой аргумент, округленный до ближайшего
целого.
При округлении таких чисел, как 1.5 и –3.5, одинаково близких к двум целым числам, round() возвращает наибольшее.
Функция sum() требует в качестве аргумента набор узлов.
Она преобразует каждый узел набора в его строковое значение,
затем каждая из этих строк преобразуется в число, и, наконец, складывает эти числа и возвращает их сумму.
Слайд 99Работа с последовательностями
В языке XPath 2.0 были добавлены новые выражения для
работы с последовательностями, такие, как:
циклы for;
кванторы every и some;
условия if.
Слайд 100Пример XML-документа
Pineapplesoft
Bookstore
0-7897-2504-5
1
XML by Example
29.99
0-672-32054-1
2
Applied XML Solutions
44.99
2-10-005763-4
2
Huit Solutions Concrètes avec XML et Java
40.00
1
Internet Magazine
3.10
Слайд 101Выражение цикла for
Выражение for, предназначено для организации цикла по элементам последовательности.
Синтаксис цикла for практически аналогичен синтаксису цикла for в языках программирования (например, C#).
Например, цикл подсчитывающий общую сумму заказа для каждой строки заказа.
for $line in /po:PurchaseOrder/po:OrderLines/po:Line
return $line/po:Price * $line/po:Quantity
Слайд 102
В данном примере for является ключевым словом, обозначающим, что необходимо перебрать
всю последовательность строк и присвоить каждую из них переменной $line.
Для выбора последовательности используется путь доступа:
po:PurchaseOrder/po:OrderLines/po:Line.
Далее следует ключевое слово return, которое динамически создает последовательность.
Затем на каждой итерации цикла к ней добавляется ноль, один или более элементов, после чего последовательность возвращается в качестве результата.
Слайд 103
Использование последовательностей в качестве результатов имеет важное значение, потому что это
позволяет организовать их дальнейшую обработку при помощи XPath.
Например, можно следующим образом подсчитать общую сумму заказа, передав показанную выше последовательность в функцию sum().
fn:sum(for $line in /po:PurchaseOrder/po:OrderLines/po:Line
return $line/po:Price * $line/po:Quantity)
Слайд 104Условный переход if
В языке XPath 2.0 также имеется выражение для условного
перехода if.
Например:
if(/po:PurchaseOrder/po:Seller = 'Bookstore') then 'ok' else 'ko'
В данном выражении в зависимости от истинности выражения в скобках, вычисляется либо раздел then, либо раздел else.
Слайд 105Кванторы
Кванторы (или квантифицированные выражения – quantified expressions) – это проверки, выполняющиеся
над последовательностью в целом.
Существуют два квантора, обозначающиеся ключевыми словами every (каждый) и some (какой-то).
Различие между циклом и квантором заключается в том, что результатом вычисления цикла является последовательность, результатом вычисления квантора является булевое значение.
Значением квантора every является true, если все элементы последовательности удовлетворяют условию.
Значение квантор some является истинным, если условие выполняется хотя бы для одного элемента.
Слайд 106Пример использования квантора
Например, следующее выражение использует квантор every.
every $line in
/po:PurchaseOrder/po:OrderLines/po:Line satisfies $line/po:Code
Оно состоит из двух частей:
вначале значение последовательности присваивается переменной (аналогично тому, как это делается в цикле),
а затем указывается условие, которому должны удовлетворять элементы последовательности.
Результатом вычисления выше приведенного выражения будет false, так как четвертая строка не содержит элемент po:Code.
Если же заменить квантор every на some, то результатом будет true, ввиду того, что элемент po:Code содержится как минимум в одной строке.
Слайд 107
Выражения над последовательностями можно комбинировать, создавая тем самым сложные запросы.
Например,
подсчет общей суммы заказа только по тем строкам, которые включают атрибут кода продукта (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, которое возвращающее пустую последовательность в том случае, если отсутствия атрибут кода продукта.
particular book -->
Harry Potter79.99
Learning XML
69.95
Intro. to Databases
39.00
Слайд 110XPath пути к элементам
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 //@lang
Selects the document root node ././.
Selects all the book element nodes /bookstore//@lang/../..
Selects the empty set ./book/tilte/@lang
Слайд 111XPath пути к элементам (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 /bookstore/book/title/..//@*
Слайд 112
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 /descendant::title/@*/parent::title/following::node()
Слайд 113Предикаты
[position() op #], [last()]
op: =, !=, , =
test position
among siblings
[attribute::name op “value"]
op: =, !=, <, >, <=, >=
test equality of an attribute
[axis:nodeSelector]
test pattern
Слайд 114Примеры использования предикатов
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 //node()[@*]
Selects nodes with an attribute named lang or has a child element named price - //node()[@lang or child::price]
Selects all the title element of all book elements with a price greater than 35.00 /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()]
Слайд 115Упражнение на XPath выражения
Задача: найти title и isbn книг, которые не
fiction и стоят (цена, price) более чем 50 USD.
Harry Potter
79.99
Learning XML
69.95
Intro. to Databases
39.00
Ответ:
/bookstore/book[attribute::cat!="fiction" and price>50.00]/title |
/bookstore/book[attribute::cat!="fiction" and price>50.00]/@isbn
Слайд 116Упражнение на XPath выражения
Задача: find average price of textbooks.
a bookstore database -->
Harry Potter
79.99
Learning XML
69.95
Intro. to Databases
39.00
Ответ:
sum(/bookstore/book[attribute::cat="textbook"]/price/number(text())) div
count(/bookstore/book[attribute::cat=“textbook”]/price)
Слайд 117
Question: find the titles of textbooks on XML.
a bookstore database -->
Harry Potter
79.99
Learning XML
69.95
Intro. to Databases
39.00
Answer:
/bookstore/book[attribute::cat="textbook" and contains(title, "XML")]/title/text()
Слайд 118Корневой маршрут
Простейшим маршрутом поиска является тот, который указывает на корневой узел
документа. Этот маршрут представляет собой просто наклонную черту "/".
Например, данный шаблон XSLT использует образец XPath “/” для выбора всего дерева входного документа и заключения его в элемент html:
Наклонная черта "/" – это абсолютный маршрут поиска, так как независимо от контекстного узла, независимо от того, в каком месте входного документа применен данный шаблон, он всегда обозначает одно и тоже: корневой узел документа.
Слайд 119Маршруты к дочерним элементам
Второй простейший маршрут – это одиночное имя элемента.
Он позволяет выбрать все дочерние элементы с указанным именем.
Например, выражение XPath “profession” ссылается на все дочерние элементы «profession» контекстного узла.
Точный набор выбираемых элементов зависит от контекстного узла, поэтому это относительный маршрут XPath.
Слайд 120Пример ссылки на дочерние элементы
Если контекстным узлом является элемент «person» Алана
Тьюринга, тогда маршрут “profession” будет ссылаться на три дочерних элемента profession:
специалист по информатикематематиккриптографА если контекстным узлом является элемент «person» Ричарда Фейнмана из того же примера, выражение XPath “profession” будет ссылаться на единственный его дочерний элемент «profession»:
физикЕсли контекстным узлом является дочерний элемент «name» элемента «person» Ричарда Фейнмана или Алана Тьюринга, тогда данный маршрут XPath не будет ссылаться ни на что, так как ни один из элементов «name» не имеет дочерних элементов «profession».
Слайд 121
В XSLT преобразовании контекстным узлом выражения XPath, используемом в атрибуте select
элемента xsl:apply-templates и ему подобных, является текущий найденный узел.
Когда другие системы, такие как XPointer, используют XPath, для определения контекстного узла предоставляются другие средства.
Слайд 122Пример простой таблицы стилей
Рассмотрим
шаблон для элемента person.
Процессор XSLT дважды активизирует этот шаблон, по одному разу на каждый узел person в документе.
В первый раз контекстным узлом является элемент person Алана Тьюринга.
Во второй раз контекстным узлом становится элемент person Ричарда Фейнмана.
При активизации одного и того же шаблона для различных контекстных узлов выражение XPath в каждый раз обращается к разным элементам, и поэтому результаты его работы различаются.
Слайд 123Маршруты к атрибутам
Для выбора определенного атрибута элемента, используйте знак @, за
которым следует имя нужного атрибута.
Например, выражение XPath “@born” выбирает атрибут «born» контекстного узла.
|
|
|
Результат:
Алан Тьюринг 1912 1954
Ричард М Фейнман 1918 1988
Слайд 124Функции для работы со специальными узлами
Для работы текстовыми узлами, комментариями и
инструкции обработки используются специальные функции:
text() – для получения значения текстового узла;
comment() – для получения значения комментария;
processing-instruction() – для получения значения инструкции обработки.
Слайд 125
Значением узла комментария является текст комментария.
Значением узла атрибута – значение атрибута.
Значением
узла инструкции обработки являются данные инструкции обработки.
Слайд 126
Так как узлы комментариев и текстовые узлы не имеют имен, функциям
comment() и text() соответствует любой комментарий или текстовый узел, являющийся непосредственным дочерним узлом контекстного узла.
Каждый комментарий является отдельным узлом комментария.
Каждый текстовый узел содержит максимально возможный непрерывный отрезок текста, не прерванный тегом. Ссылки на сущности и секции CDATA заменяются на текст и разметку и не разбивают текстовые узлы.
По умолчанию таблицы стилей XSLT обрабатывают текстовые узлы, но пропускают узлы комментариев.
Можно добавить в таблицу стилей XSLT шаблон для комментария, и тогда комментарии также будут обработаны.
Следующий шаблон меняет каждый комментарий на текст «Комментарий удален», выделенный курсивом:
Комментарий удален
Слайд 127Подстановочные выражения
Подстановочные выражения позволяют выбирать несколько типов элементов и узлов одновременно.
Существует три подстановочных выражения:
звездочка ‘*’ – соответствует любому узлу элемента, независимо от его типа.
node() – соответствующее всем узлам: элементов, текста, атрибутов, инструкций обработки, пространств имен и комментариев.
‘@*’ – соответствует всем узлам атрибутов. .
Слайд 128Подстановочный элемент ‘*’
Звездочка ‘*’ соответствует любому узлу элемента, независимо от его
типа (но не соответствует атрибутам и комментариям и пр.).
Например, следующий шаблон XSLT говорит, что должны быть обработаны дочерние элементы всех элементов, однако никакие данные выводить не требуется:
Звездочка не соответствует атрибутам, текстовым узлам, комментариям или узлам инструкций обработки.
Поэтому в приведенном примере выдается информация только из дочерних элементов, у которых есть собственные шаблоны, переопределяющие данный.
Перед звездочкой может присутствовать префикс пространства имен. В этом случае выбираются только элементы из указанного пространства имен.
Например, svg:* соответствует всем элементам с тем же URI пространства имен, что и у префикса svg.
Как правило, имеет значение именно URI, а не префикс. Префиксы в таблице стилей и исходном документе могут отличаться, но URI пространств имен должны совпадать.
Слайд 129Подстановочный элемент node()
node() – это подстановочное выражение, соответствующее, в отличии от
‘*’, всем узлам:
элементов,
текста,
атрибутов,
инструкций обработки,
пространств имен и
комментариев.
Слайд 130Подстановочный элемент ‘@*’
Выражение ‘@*’ соответствует всем узлам атрибутов.
Например, данный шаблон
XSLT копирует значения всех атрибутов элемента person входного документа в элементы attributes выходного документа:
К выражению можно добавить префикс пространства имен для выбора атрибутов конкретного пространства имен, подобно тому, как это делается с элементами.
Например, @xlink:* соответствует всем атрибутам XLink, при условии, что префиксу xlink поставлено в соответствие пространство имен http://www.w3.org/1999/xlink. И опять имеет значение именно URI, а не фактически используемый префикс.
Слайд 131Составные маршруты поиска
Рассмотренные выражения XPath (имена элементов, @ плюс имя атрибута,
‘/’) являются одиночными шагами поиска.
Эти шаги поиска можно объединять с помощью косой черты, перемещаясь вниз по иерархии от найденного узла к другим узлам.
Можно также использовать
точку ‘.’ для ссылки на текущий узел,
две точки ‘..’ для ссылки на родительский узел
двойной слэш ‘//’ для ссылки на потомков контекстного узла.
Символ ‘/’ объединяет различные шаги в составной маршрут поиска.
Каждый шаг в маршруте является относительным по отношению к предшествующему.
Если маршрут начинается с ‘/’, первый шаг является относительным по отношению к корневому узлу.
В противном случае он является относительным по отношению к контекстному узлу.
Слайд 132Пример сложного маршрута с помощью наклонной черты
Пример: выражение /people/person/name/first_name.
Это
выражение начинается с корневого узла, выбирает все дочерние элементы «people» корневого узла,
выбирает все дочерние элементы «person» этих узлов,
затем все дочерние элементы «name» этих узлов
и, наконец, все дочерние элементы «first_name» этих узлов.
Применительно к примеру, выражение соответствует следующим двум элементам:
Алан
Ричард
Чтобы выделить только текстовое содержимое этих двух узлов, нужен один шаг.
Например: “/people/person/name/first_name/text()” выберет из примера строки «Алан» и «Ричард».
Оба эти выражения XPath начинаются с ‘/’, поэтому они являются абсолютными, начинающимися с корня маршрутами поиска. Относительные маршруты могут отсчитываться от контекстного узла.
Например, выражение XPath “person/@id” выбирает атрибут id дочернего по отношению к контекстному узлу элемента person.
Слайд 133Выбор всех потомков
Для выбора всех потомков используется двойная косая черта.
Двойная наклонная
черта ‘//’ выбирает всех потомков контекстного узла, а также сам контекстный узел.
В начале выражения XPath эти символы позволяют выбрать всех потомков корневого узла.
Например, выражение XPath ‘//name’ выбирает в документе все элементы name.
Выражение ‘person//@id’ выбирает все атрибуты «id» всех элементов, содержащихся в дочернем элементе «person» контекстного узла.
Слайд 134Выбор родительского элемента
Родительский элемент можно выбрать с помощью двойной точки.
Две точки
‘..’ обозначают родителя текущего узла.
Например, выражение XPath ‘//@id’ относится ко всем атрибутам id в документе: оно выбирает все атрибуты id любого элемента документа.
Выражение ‘person//@id’ выбирает все атрибуты id всех элементов, содержащихся в дочернем элементе person контекстного узла. Следовательно, //@id/.. Указывает на все элементы документа, имеющие атрибут id.
Выражение //middle_initial/../first_name идентифицирует в документе все элементы first_name, которые являются одноуровневыми для элементов middle_initial.
Применительно к примеру это выражение выбирает Ричард,
но не выбирает Алан.
Слайд 135Выбор текущего элемента с помощью точки
Одинарная точка указывает на текущий узел.
В XSLT она чаще всего используется, когда требуется получить значение текущего найденного элемента.
Например, данный шаблон копирует содержимое каждого комментария из входного документа в элемент span выходного документа, выделяя его курсивом:
Символ ‘.’ – значение атрибута select элемента xsl:value-of – обозначает найденный элемент.
Эта схема одинаково хорошо подходит для узлов элементов, атрибутов и всех других видов узлов.
Например, следующий шаблон выбирает элементы «name» из входного документа и копирует в выходной документ, выделяя их:
Слайд 136Предикаты
В общем случае выражение XPath может ссылаться более чем на один
узел. Иногда это именно то, что требуется, однако в некоторых случаях приходится просеивать набор узлов, возвращаемый выражением, чтобы выбрать только несколько из них.
Каждый шаг в маршруте поиска может иметь предикат, который делает выбор из текущего на данном шаге выражения списка узлов.
Предикат содержит логическое выражение, которое проверяется для каждого узла в контекстном списке узлов. Если выражение ложно, этот узел удаляется из списка, в противном случае – сохраняется.
Предположим, например, что требуется найти все элементы «profession», которые имеют значение физик.
Выражение XPath //profession[.="физик"] находит все такие элементы. Здесь точка обозначает строковое значение текущего узла, то есть то же, что возвращает элемент xsl:value-of.
Можно использовать одинарные кавычки вместо двойных, когда выражение XPath помещено внутрь значения атрибута, уже находящегося в кавычках.
Например .
Слайд 137Выполнение сравнений
Для выбора всех элементов «person», имеющих дочерний элемент «profession»
со значением «физик» нужно использовать выражение “//person [profession="физик"]”.
Если требуется найти элемент «person» с «id», равным “p4567”, то нужно задать перед именем атрибута символ ‘@’.
Например, в выражении //person[@id="p4567"].
XPath кроме знака равенства поддерживает полный набор операторов сравнения, в том числе <, >, >=, <= и !=.
Например, выражение //person[@born<=1976] ищет в документе все элементы person с атрибутом born, числовое значение которого меньше или равно 1976.
Если < или <= используются внутри XML-документа, необходимо заменять знак «меньше» на “<”
Например .
Однако, если выражение XPath находится вне XML-документа, как в некоторых случаях использования XPointer, знак «меньше» можно не заменять.
Слайд 138Использование логических операций
XPath также предусматривает логические операторы and и or для
логического объединения выражений.
Пример 1: выбрать все элементы person, значения атрибутов born которых находятся между 1910 и 1920 включительно.
//person[@born<=1920 and @born>=1910]
Пример 2: выбрать все элементы name, имеющие дочерние элементы first_name со значением Ричард или Дик.
//name[first_name="Ричард" or first_name="Дик"]
Слайд 139
Выражение XPath “//name” выбирает все элементы «name».
Выражение “//name[middle_initial]” выбирает все
элементы «name» и затем проверяет каждый из них на наличие дочернего элемента middle_initial. Сохраняются только те элементы, в которых есть такой дочерний элемент.
Например, //name[middle_initial] выберет элемент «name» Ричарда М. Фейнмана, но не выберет «name» Алана Тьюринга.
Любой или все шаги в маршруте поиска могут иметь предикаты.
Например, выражение
“/people/person[@born < 1950]/name[first_name="Алан"]”
сначала выбирает все дочерние элементы people корневого узла (в примере такой только один).
Затем он выбирает из этих элементов все элементы person, атрибуты born которых имеют числовое значение меньше 1950.
И наконец, из этой группы элементов отбираются все дочерние элементы name, у которых дочерний элемент first_name имеет значение Алан.
Слайд 140Полные маршруты поиска
Ранее рассмотренные маршруты называются «сокращенными маршрутами поиска». Именно они
лучше всего подходят для масок поиска XSLT.
В XPath также определен полный синтаксис для полных маршрутов поиска, который более многословен и более гибок.
Каждый шаг в маршруте поиска имеет
обязательные части
ось поиска
критерий узла,
необязательная часть
предикаты.
Ось указывает направление перемещения от контекстного узла для поиска следующих узлов.
Критерий узла определяет, какие узлы по этой оси следует включать.
Предикаты дополнительно отсеивают узлы в соответствии с указанным в предикате выражением.
Слайд 141Оси поиска
В языке XPath понятие оси служит для того, чтобы выделить
в дереве документа различные подмножества узлов относительно некоторого узла, называемого контекстным.
В общем случае эти подмножества пересекаются, но оси ancestor, descendant, following, preceding и self разбивают документ на непересекающиеся части, в совокупности содержащие все узлы (за исключением тех, что соответствуют пространствам имен и атрибутам).
Контекстный узел устанавливается языком, в который погружен XPath.
В случае XSLT контекстный узел устанавливают следующие конструкции:
сопоставление с шаблоном
…;
оператор xsl:for-each;
оператор xsl:apply-templates.
Слайд 142Оси сокращенного синтаксиса
Сокращенный синтаксис позволяет перемещаться по следующим осям:
ось дочерних узлов
(child),
ось родительских узлов (parent),
собственная оси (self),
ось атрибутов (attribute) и
оси потомков с включением контекстного узла (descendant-or-self).
Слайд 143Дополнительные оси полного синтаксиса
Полный синтаксис добавляет еще восемь осей:
Ось предков (ancestor)
- Все узлы элементов, содержащие контекстный узел; родительский узел, родитель родителя, родитель родителя родителя и т.д. вверх вплоть до корневого узла в порядке, обратном расположению узлов в документе.
Ось следующих одноуровневых узлов (following-sibling) - Все узлы, следующие за контекстным узлом и содержащиеся в том же узле родительского элемента, в том же порядке, в каком узлы присутствуют в документе.
Ось предыдущих одноуровневых узлов (preceding-sibling) - Все узлы, предшествующие контекстному узлу и содержащиеся в том же узле родительского элемента, в порядке, обратном порядку в документе.
Ось следующих узлов (following) - Все узлы, следующие после контекстного узла, в том же порядке, в каком узлы присутствуют в документе.
Ось предыдущих узлов (preceding) - Все узлы, предшествующие началу контекстного узла, в порядке, обратном порядку в документе.
Ось пространств имен (namespace) - Все пространства имен в области действия контекстного узла, объявленные либо в контекстном узле, либо в одном из его предков.
Ось потомков (descendant) - Все потомки контекстного узла, исключая сам контекстный узел.
Ось предков, включая контекстный узел (ancestor-or-self) - Все предки контекстного узла, включая сам контекстный узел.
Слайд 144Пример XSLT преобразования с использованием полный синтаксиса
Слайд 145Пояснение примера
Первый шаблон соответствует корневому узлу.
Он применяет шаблоны ко всем
потомкам корневого узла, являющимся элементами person, то есть перемещается от корневого узла по оси потомков (descendant) с критерием узла person.
Второй шаблон соответствует элементам person.
Он помещает дочерние элементы name каждого элемента person в элемент dt.
(Использованный здесь маршрут поиска, child::name, может быть переписан и в сокращенной форме – в виде одного слова name.)
Далее шаблоны применяются ко всем элементам, следующим за элементом name на том же уровне иерархии.
Шаблон начинает обработку с контекстного узла person, затем перемещается по оси дочерних элементов в поисках элемента name.
Отсюда процессор перемещается по оси следующих одноуровневых узлов (following-sibling) и ищет элементы любого типа (*) после элемента name, также являющиеся дочерними для того же элемента person.
Для оси following-sibling не существует сокращенного эквивалента, и потому это действительно простейший способ написания данной конструкции.
Слайд 146Пояснение примера (2)
Третий шаблон
выбирает любые элементы, не подходящие для других
шаблонов; он просто помещает такие элементы в элемент li.
Выражение XPath self::* выбирает значение текущего найденного элемента, то есть контекстного узла.
Это выражение можно сократить до символа «точка».
Четвертый (последний) шаблон
выбирает элементы homepage.
В этом случае требуется выбрать значение атрибута xlink:href, поэтому от контекстного узла homepage мы перемещаемся по оси атрибутов.
Критерий узлов выбирает атрибуты xlink:href.
Точнее, он ищет атрибут с локальным именем href, префиксу которого поставлено в соответствие URI пространства имен http://www.w3.org/1999/xlink.