Языки описания информации Лекция 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.Функции.
Языки описания информации Лекция 4. Кафедра «ОСУ» Весенний семестр 2010/2011 уч. года XPath.
XML eXtensible Markup Language 1.Определение типа документов (DTD) 2.Язык навигации внутри XML-документа (XPath)
XML- технологии Лекция 3 XPath- адресация. Что такое XPath? XPath - это синтаксис для адресации частей XML- документа XPath использует пути для адресации.
XML eXtensible Markup Language 1.Язык навигации внутри XML-документа (XPath) 2.Пространства имён (Namespaces) 3.Язык трансформаций (XSLT)
XPath выступает в роли подъязыка преобразований XSLT и XPointer. Выражение XPath используется для манипуляции строками, в числовых выражениях, а также.
XML и XSLT (2) Матросов Александр Васильевич Санкт-Петербургский государственный университет.
Java Advanced XML Transformations 1.0 (XSLT 1.0).
XSLT-ТРАНСФОРМАЦИЯ XML- ТЕХНОЛОГИИ Лекция 4. Трансформация XML- данных Категории трансформации Структурные трансформации – трансформация одного словаря.
Технология Идентификации Ресурсов X-Pointer. Предназначение X-Pointer – это язык, описывающий местонахождение тех или иных ресурсов. Выражения языка X-Pointer.
Основы SQL Запросы к базе данных. Что такое база данных SQL? SQL (Structured Query Language - «Структурированный язык запросов») - универсальный компьютерный.
Инструменты VS 2010 для работы с XML языком XML редактор. XSLT отладчик XSLT Profiler, инструмент позволяющий разработчикам измерять, оценивать и решать.
Язык запросов XML. XML (Extensible Markup Language) - это новый SGML-производный язык разметки документов, позволяющий структурировать информацию разного.
СУБД 5. SQL для выборки данных. 2 SELECT Обработка элементов оператора SELECT выполняется в следующей последовательности: FROM – определяются имена используемых.
Презентация на тему: Ключевое слово TOP n [PERCENT] [WITH TIES]
XPath Набор синтаксических правил для адресации элементов XML-документа.
Учебная дисциплина «Базы данных» для студентов специальности Бизнес-информатика (бакалавриат) ЛЕКЦИЯ 3 ВВЕДЕНИЕ В РЕЛЯЦИОННУЮ МОДЕЛЬ ДАННЫХ Вопрос.
XSL eXtensible Stylesheet Language среда, 11 декабря 2013 г.среда, 11 декабря 2013 г.среда, 11 декабря 2013 г.среда, 11 декабря 2013 г.среда, 11 декабря.
Интернет- технологии МИИГаИК. Указание XML-документов в ориентире на будущее
Транксрипт:

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

Язык XPath XML Path Language 2.0

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

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

Древовидная структура XML документа XML документ представляет собой дерево, состоящее из узлов. Некоторые узлы могут содержать другие узлы. Один корневой узел в конечном счете включает в себя все остальные узлы. XPath – это язык для выбора узлов и наборов узлов этого дерева. С точки зрения XPath существует семь типов узлов: 1. Корневой узел 2. Узлы элементов 3. Текстовые узлы 4. Узлы атрибутов 5. Узлы комментариев 6. Узлы инструкций обработки 7. Узлы пространств имен В этом списке нет таких конструкций, как секции CDATA, ссылки на сущности и объявления типа документа. XPath работает с XML-документом уже после того, как они объединены с документом. – Например, XPath не сможет идентифицировать первую секцию CDATA в документе или различить, включено ли данное значение атрибута непосредственно в начальный тег исходного элемента или было взято как значение по умолчанию из объявления атрибута в 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 1. Корневой узел не совпадает с корневым элементом. – Корневой узел дерева содержит в себе весь документ, в том числе корневой элемент, а также комментарии и инструкции обработки, находящиеся перед начальным тегом корневого элемента или после конечного тега корневого элемента. В приведенном примере корневой узел содержит инструкцию обработки xml-stylesheet и корневой элемент people. 2. Модель данных XPath включает не все, что есть в документе. – В частности, XML-объявление и DTD не доступны через XPath. 3.Однако, если DTD предоставляет значения по умолчанию для каких-либо атрибутов, XPath распознает эти атрибуты. – Например, элемент homepage имеет атрибут xlink:type, предоставляемый DTD. – Разрешаются все ссылки на анализируемые сущности.

Элемент homepage имеет атрибут xlink:type, предоставляемый DTD. Также разрешаются все ссылки на анализируемые сущности. Ссылки на сущности, символьные ссылки и секции CDATA не различимы, хотя все данные, которые в них содержатся, доступны. – Например, XSLT не позволит выделить жирным шрифтом весь текст в секциях CDATA, потому что XPath не знает, какой текст является частью секции CDATA, а какой не является. И наконец, атрибуты xmlns представляются в виде узлов пространств имен. – Они не рассматриваются как узлы атрибутов, хотя анализатор, не знающий о пространствах имен, увидит их как атрибуты. – Кроме того, эти узлы присоединяются к каждому узлу элементов и атрибутов, относящемуся к области действия объявления, а не к одному только узлу того элемента, в котором объявлено пространство имен.

Ссылки на сущности, символьные ссылки и секции CDATA не различимы, хотя все данные, которые в них содержатся, доступны. – Например, XSLT не позволит выделить жирным шрифтом весь текст в секциях CDATA, потому что XPath не знает, какой текст является частью секции CDATA, а какой не является. Атрибуты xmlns представляются в виде узлов пространств имен. – Они не рассматриваются как узлы атрибутов, хотя анализатор, не знающий о пространствах имен, увидит их как атрибуты. – Эти узлы присоединяются к каждому узлу элементов и атрибутов, относящемуся к области действия объявления, а не к одному только узлу того элемента, в котором объявлено пространство имен.

Маршруты поиска Самыми полезными выражениями XPath являются маршруты поиска. Типы маршрутов поиска – сокращенные маршруты поиска: простые маршруты: – корневой маршрут - указывает на корневой узел документа (/); – маршруты к дочерним элементам - одиночное имя элемента (имя-элемента); – маршруты к атрибутам - для выбора определенного атрибута элемента – подстановочные элементы (*, составные маршруты (/,//,.,..): – полные маршруты поиска.

Маршрут поиска использует как минимум один шаг для идентификации набора узлов документа. Этот набор может быть пустым, содержать один узел или содержать несколько узлов. Узел может быть 1. корневым узлом, 2. узлом элементов, 3. узлом атрибутов, 4. узлом пространств имен, 5. узлом текста, 6. узлом комментариев, 7. узлом инструкцией обработки 8. Или любой их комбинацией.

Описание выражений / - Selects the document root node (absolute path) node Selects the node (relative path) // - Selects all descendent nodes of the current node that match the selection. - Selects the current node.. - Selects the parent of the current - Selects attribute nodes

Пример 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

Синтаксис и семантика XPath выражений Синтаксис locationStep1/locationStep2/… где:locationStep = axis::nodeSelector[predicate] Семантика – Найти все вершины, описанные с помощью locationStep1 Find all nodes specified by axis::nodeSelector Select only those that satisfy predicate – Для каждой такой вершины N: Find all nodes specified by locationStep2 using N as the current node Объединить их – For each node returned by locationStep2 do the same using locationStep3, …

Полный набор осей self the context node itself child the children of the context node descendant all descendants (children+) parent the parent (empty if at the root) ancestor all ancestors from the parent to the root descendantorself the union of descendant and self ancestororself the union of ancestor and self followingsibling siblings to the right precedingsibling siblings to the left following all following nodes in the document, excluding descendants preceding all preceding nodes in the document, excluding ancestors attribute the attributes of the context node

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 также определен полный синтаксис для полных маршрутов поиска, который более многословен и более гибок. Каждый шаг в маршруте поиска имеет – обязательные части ось поиска критерий узла, – необязательная часть предикаты. Ось указывает направление перемещения от контекстного узла для поиска следующих узлов. Критерий узла определяет, какие узлы по этой оси следует включать. Предикаты дополнительно отсеивают узлы в соответствии с указанным в предикате выражением.

Схема полного маршрута поиска

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

Соотношение сокращенных и полных маршрутов поиска (2) Эти полные маршруты поиска, как и сокращенные, могут быть абсолютными, если начинаются с корневого узла. – Например, полная форма /child::people/child::person – эквивалентна сокращенной форме /people/person. Полные маршруты поиска также могут иметь предикаты. – Например, сокращенный маршрут < 1950]/name[first_name="Алан"] – в полной форме превратится в

Оси поиска В языке 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 пространства имен

Общие выражения XPath Кроме маршрутов поиска выражения XPath могут также возвращать числа, логические и строковые выражения. – Например, допускаются следующие выражения XPath: 3, 'Rosalind Franklin true() 32,5 < 76,2E-21 position()=last() Если выражения XPath не являются наборами узлов, то они не могут использоваться в атрибуте match элемента xsl:template. Однако они могут выступать в качестве значений атрибута select элементов xsl:value-of и в предикатах маршрутов поиска.

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

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

Функция position() Функция position() возвращает в виде числа положение текущего узла в контекстном списке. – Например, шаблон XSLT используюет функцию position() для вычисления номера обрабатываемого элемента person относительно других узлов контекстного списка: Person,

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

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

Фильтрация узлов Часто требуется отобрать узлы в зависимости от хранящихся в них данных, возможно, в сочетании с ограничениями на имена или позицию. Во многих мини-рецептах в разделе 1.1 для фильтрации узлов использовались предикаты, но они налагали условия только на позицию или имя узла. Ниже мы рассмотрим предикаты, фильтрующие по содержимому. Во всех примерах из этого раздела перед каждым предикатом стоит имя X, но вместо него можно было бы задать произвольное путевое выражение.

Введение в язык XPath XPath is a language for finding information in an XML document. – XPath is a syntax for defining parts of an XML document – XPath uses path expressions to navigate in XML documents – XPath contains a library of standard functions – XPath is a major element in XSLT – XPath is a W3C recommendation

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 Path Expressions XPath uses path expressions to select nodes or node-sets in an XML document. These path expressions look very much like the expressions you see when you work with a traditional computer file system. XPath is Used in XSLT – XPath is a major element in the XSLT standard. Without XPath knowledge you will not be able to create XSLT documents. XQuery and XPointer are both built on XPath expressions. XQuery 1.0 and XPath 2.0 share the same data model and support the same functions and operators. XPATH is a W3C Recommendation XPath became a W3C Recommendation 16. November XPath was designed to be used by XSLT, XPointer and other XML parsing software. To read more about the XPATH activities at W3C, please read our W3C tutorial.W3C tutorial

Терминология XPath Узлы - Nodes In XPath, there are seven kinds of nodes: element, attribute, text, namespace, processing-instruction, comment, and document nodes. XML documents are treated as trees of nodes. The topmost element of the tree is called the root element. Look at the following XML document: Harry Potter J K. Rowling Example of nodes in the XML document above: – (root element node) – J K. Rowling (element node) – lang="en" (attribute node)

Atomic values Atomic values are nodes with no children or parent. Example of atomic values: – J K. Rowling – "en"Items Items are atomic values or nodes.

Взаимосвязи между узлами Parent – Each element and attribute has one parent. – In the following example; the book element is the parent of the title, author, year, and price: Harry Potter J K. Rowling Children – Element nodes may have zero, one or more children. – In the following example; the title, author, year, and price elements are all children of the book element: Harry Potter J K. Rowling

Взаимосвязи между узлами (2) Siblings – Nodes that have the same parent. – In the following example; the title, author, year, and price elements are all siblings: Harry Potter J K. Rowling Ancestors – A node's parent, parent's parent, etc. – In the following example; the ancestors of the title element are the book element and the bookstore element: Harry Potter J K. Rowling

Взаимосвязи между узлами (3) Descendants – A node's children, children's children, etc. – In the following example; descendants of the bookstore element are the book, title, author, year, and price elements: Harry Potter J K. Rowling

XPath Syntax XPath uses path expressions to select nodes or node-sets in an XML document. The node is selected by following a path or steps. The XML Example Document Harry Potter Learning XML 39.95

Selecting Nodes XPath uses path expressions to select nodes in an XML document. The node is selected by following a path or steps. The most useful path expressions are listed below: ExpressionDescription nodenameSelects all child nodes of the named node /Selects from the root node //Selects nodes in the document from the current node that match the selection no matter where they are.Selects the current node..Selects the parent of the current attributes

In the table below we have listed some path expressions and the result of the expressions: Path ExpressionResult bookstoreSelects all the child nodes of the bookstore element /bookstoreSelects the root element bookstore Note: If the path starts with a slash ( / ) it always represents an absolute path to an element! bookstore/bookSelects all book elements that are children of bookstore //bookSelects all book elements no matter where they are in the document bookstore//bookSelects all book elements that are descendant of the bookstore element, no matter where they are under the bookstore element all attributes that are named lang

Предикаты Predicates are used to find a specific node or a node that contains a specific value. Predicates are always embedded in square brackets. In the table below we have listed some path expressions with predicates and the result of the expressions: Path ExpressionResult /bookstore/book[1]Selects the first book element that is the child of the bookstore element.Note: IE5 and later has implemented that [0] should be the first node, but according to the W3C standard it should have been [1]!! /bookstore/book[last()]Selects the last book element that is the child of the bookstore element /bookstore/book[last()-1]Selects the last but one book element that is the child of the bookstore element /bookstore/book[position()35.00]Selects all the book elements of the bookstore element that have a price element with a value greater than /bookstore/book[price>35.00]/titleSelects all the title elements of the book elements of the bookstore element that have a price element with a value greater than 35.00

Выбор неизвестных узлов XPath wildcards can be used to select unknown XML elements. WildcardDescription *Matches any element any attribute node node()Matches any node of any kind In the table below we have listed some path expressions and the result of the expressions: Path ExpressionResult /bookstore/*Selects all the child nodes of the bookstore element //*Selects all elements in the document all title elements which have any attribute

Выбор нескольких путей By using the | operator in an XPath expression you can select several paths. In the table below we have listed some path expressions and the result of the expressions: Path ExpressionResult //book/title | //book/priceSelects all the title AND price elements of all book elements //title | //priceSelects all the title AND price elements in the document /bookstore/book/title | //price Selects all the title elements of the book element of the bookstore element AND all the price elements in the document

XPath Axes The XML Example Document Harry Potter Learning XML 39.95

XPath Axes An axis defines a node-set relative to the current node. AxisNameResult ancestorSelects all ancestors (parent, grandparent, etc.) of the current node ancestor-or-selfSelects all ancestors (parent, grandparent, etc.) of the current node and the current node itself attributeSelects all attributes of the current node childSelects all children of the current node descendantSelects all descendants (children, grandchildren, etc.) of the current node descendant-or-selfSelects all descendants (children, grandchildren, etc.) of the current node and the current node itself followingSelects everything in the document after the closing tag of the current node following-siblingSelects all siblings after the current node namespaceSelects all namespace nodes of the current node parentSelects the parent of the current node precedingSelects everything in the document that is before the start tag of the current node preceding-siblingSelects all siblings before the current node selfSelects the current node

Location Path Expression A location path can be absolute or relative. – An absolute location path starts with a slash ( / ) and – a relative location path does not. In both cases the location path consists of one or more steps, each separated by a slash: – An absolute location path: /step/step/... – A relative location path: step/step/... Each step is evaluated against the nodes in the current node- set. A step consists of: – an axis (defines the tree-relationship between the selected nodes and the current node) – a node-test (identifies a node within an axis) – zero or more predicates (to further refine the selected node-set) The syntax for a location step is: – axisname::nodetest[predicate]

Примеры Примеры Location Path Expression ExampleResult child::bookSelects all book nodes that are children of the current node attribute::langSelects the lang attribute of the current node child::*Selects all children of the current node attribute::*Selects all attributes of the current node child::text()Selects all text child nodes of the current node child::node()Selects all child nodes of the current node descendant::bookSelects all book descendants of the current node ancestor::bookSelects all book ancestors of the current node ancestor-or-self::bookSelects all book ancestors of the current node - and the current as well if it is a book node child::*/child::priceSelects all price grandchildren of the current node

Операции XPath Список операций, которые могут быть использованы в XPath выражениях: Операция ОписаниеПример Возвращаемое значение |Объединяет два набора узлов //book | //cdReturns a node-set with all book and cd elements +Addition Subtraction *Multiplication 6 * 424 divDivision 8 div 42 =Equal price=9.80true if price is 9.80 false if price is 9.90 !=Not equal price!=9.80true if price is 9.90 false if price is 9.80 =9.80true if price is 9.90 false if price is 9.70 or price=9.80 or price=9.70 true if price is 9.80 false if price is 9.50 and price>9.00 and price

Пример XML документа (books.xml) Everyday Italian Giada De Laurentiis Harry Potter J K. Rowling XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan Learning XML Erik T. Ray

Загрузка XML документа Using XMLHttpRequest to load XML documents is supported in all modern browsers. Code for most modern browsers: – var xmlhttp=new XMLHttpRequest()Code for old Microsoft browsers (IE 5 and 6): – var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP") Selecting Nodes Unfortunately, there are different ways of dealing with XPath in Internet Explorer and other browsers. In our examples we have included code that should work with most major browsers. Internet Explorer uses the selectNodes() method to select nodes from the XML document: – xmlDoc.selectNodes(xpath);Firefox, Chrome, Opera and Safari use the evaluate() method to select nodes from the XML document: – xmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE,null);

function loadXMLDoc(dname) { if (window.XMLHttpRequest) { xhttp=new XMLHttpRequest(); } else { xhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xhttp.open("GET",dname,false); xhttp.send(""); return xhttp.responseXML; } xml=loadXMLDoc("books.xml"); path="/bookstore/book/title" // code for IE if (window.ActiveXObject) { var nodes=xml.selectNodes(path); for (i=0;i

Примеры Select all the titles = /bookstore/book/title Select the title of the first book = /bookstore/book[1]/title – There is a problem with this. The example above shows different results in IE and other browsers. – IE5 and later has implemented that [0] should be the first node, but according to the W3C standard it should have been [1]!! A Workaround! To solve the [0] and [1] problem in IE5+, you can set the SelectionLanguage to XPath. – The following example selects the title of the first book node under the bookstore element: – xml.setProperty("SelectionLanguage","XPath"); – xml.selectNodes("/bookstore/book[1]/title"); Select all the prices = /bookstore/book/price/text() Select price nodes with price>35 = /bookstore/book[price>35]/price Select title nodes with price>35 = /bookstore/book[price>35]/title