'

Языки описания информации

Понравилась презентация – покажи это...





Слайд 0

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


Слайд 1

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


Слайд 2

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


Слайд 3

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


Слайд 4

Язык XPath (XML Path Language)


Слайд 5

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


Слайд 6

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


Слайд 7

XPath 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


Слайд 8

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


Слайд 9

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


Слайд 10

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


Слайд 11

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


Слайд 12

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


Слайд 13

Пример XML документа <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="people.xsl"?> <!DOCTYPE people [ <!ATTLIST homepage xlink:type CDATA #FIXED "simple” xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"> <!ATTLIST person id ID #IMPLIED> ]> <people> <person born="1912" died="1954" id="p342"> <name> <first_name>Алан</first_name> <last_name>Тьюринг</last_name> </name> <!-- Существовало ли понятие «специалист по информатике» во времена Тьюринга? --> <profession>специалист по информатике</profession> <profession>математик</profession> <profession>криптограф</profession> <homepage xlink:href="http://www.turing.org.uk/"/> </person> <person born="1918" died="1988" id="p4567"> <name> <first_name>Ричард</first_name> <middle_initial>&#x4D;</middle_initial> <last_name>Фейнман</last_name> </name> <profession>физик</profession> <hobby>Игра на бонгах</hobby> </person> </people>


Слайд 14

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


Слайд 15

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


Слайд 16

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


Слайд 17

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


Слайд 18

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


Слайд 19

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


Слайд 20

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


Слайд 21

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


Слайд 22

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


Слайд 23

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


Слайд 24

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


Слайд 25

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


Слайд 26

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


Слайд 27

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


Слайд 28

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


Слайд 29

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


Слайд 30

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


Слайд 31

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


Слайд 32

Список допустимых осей


Слайд 33

Список допустимых осей (2)


Слайд 34

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


Слайд 35

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


Слайд 36

Операторы, используемые для описания путей доступа


Слайд 37

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


Слайд 38

Приоритеты операций путей доступа


Слайд 39

Список специальных символов записи пути доступа


Слайд 40

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


Слайд 41

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


Слайд 42

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


Слайд 43

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


Слайд 44

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


Слайд 45

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


Слайд 46

Примеры использования операторов путей доступа


Слайд 47

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


Слайд 48

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


Слайд 49

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


Слайд 50

В языке XPath кроме знака равенства поддерживает полный набор операторов сравнения, в том числе <, >, >=, <= и !=. Например, выражение //person[@born<=1976] ищет в документе все элементы person с атрибутом born, числовое значение которого меньше или равно 1976. Следует помнить, что если < или <= используются внутри XML-документа, необходимо заменять знак «меньше» на &lt; например "//person[@born &lt;= 1976]".


Слайд 51

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


Слайд 52

Примеры использования предикатов в путях доступа


Слайд 53

Примеры использования предикатов в путях доступа (2)


Слайд 54

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


Слайд 55

Примеры использования символа подстановки в путях доступа


Слайд 56

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


Слайд 57

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


Слайд 58

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


Слайд 59

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


Слайд 60

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


Слайд 61

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


Слайд 62

Примеры выбора элементов последовательности


Слайд 63

Примеры выбора элементов последовательности


Слайд 64

Примеры выбора элементов последовательности Фрагмент XML-документа: <x> <y/><y/> </x> <x> <y/><y/> </x>


Слайд 65

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


Слайд 66

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


Слайд 67

Поиск последнего элемента в последовательности Функция last() возвращает значение true для последнего элемента в последовательности. Следует обратить внимание, что функция last() относится к родительскому узлу. Примеры выбора последнего элемента последовательности приведены в табл.


Слайд 68

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


Слайд 69

Примеры группировки операторов пути доступа


Слайд 70

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


Слайд 71

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


Слайд 72

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


Слайд 73

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


Слайд 74

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


Слайд 75

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


Слайд 76

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


Слайд 77

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


Слайд 78

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


Слайд 79

Логические значения Логические значения, которые могут быть равными только true (истина) или false (ложь), обычно создаются в результате сравнения других объектов. В языке XPath имеются операторы сравнения (=, !=, <, >, >= и <=), логические операторы (and и or). Логические значения часто используются в предикатах путей доступа. Например, в пути доступа //person[profession="физик"] логическим выражением является profession="физик".


Слайд 80

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


Слайд 81

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


Слайд 82

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


Слайд 83

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


Слайд 84

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


Слайд 85

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


Слайд 86

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


Слайд 87

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


Слайд 88

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


Слайд 89

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


Слайд 90

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


Слайд 91

функция 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.


Слайд 92

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


Слайд 93

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


Слайд 94

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


Слайд 95

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


Слайд 96

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


Слайд 97

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


Слайд 98

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


Слайд 99

Пример XML-документа <?xml version="1.0" encoding="ISO-8859-1"?> <po:PurchaseOrder xmlns:po="http://www.marchal.com/2006/po"> <po:Buyer>Pineapplesoft</po:Buyer> <po:Seller>Bookstore</po:Seller> <po:OrderLines> <po:Line> <po:Code type="ISBN">0-7897-2504-5<po:Code> <po:Quantity>1<po:Quantity> <po:Description> XML by Example<po:Description> <po:Price>29.99<po:Price> </po:Line> <po:Line> <po:Code type="ISBN">0-672-32054-1</po:Code> <po:Quantity>2<po:Quantity> <po:Description> Applied XML Solutions<po:Description> <po:Price>44.99</po:Price> </po:Line> <po:Line> <po:Code type="ISBN">2-10-005763-4<po:Code> <po:Quantity>2<po:Quantity> <po:Description> Huit Solutions Concretes avec XML et Java </po:Description> <po:Price>40.00<po:Price> </po:Line> <po:Line> <po:Quantity>1<po:Quantity> <po:Description> Internet Magazine <po:Description> <po:Price>3.10<po:Price> <po:Line> </po:OrderLines> <po:PurchaseOrder>


Слайд 100

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


Слайд 101

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


Слайд 102

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


Слайд 103

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


Слайд 104

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


Слайд 105

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


Слайд 106

Выражения над последовательностями можно комбинировать, создавая тем самым сложные запросы. Например, подсчет общей суммы заказа только по тем строкам, которые включают атрибут кода продукта (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, которое возвращающее пустую последовательность в том случае, если отсутствия атрибут кода продукта.


Слайд 107

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


Слайд 108

Пример XML <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <!-- a bookstore database --> <book isbn=“111111” cat=“fiction”> <!-- a particular book --> <title lang=“chn”>Harry Potter</title> <price unit=“us”>79.99</price> </book> <book isbn=“222222” cat=“textbook”> <title lang=“eng”>Learning XML</title> <price unit=“us”>69.95</price> </book> <book isbn "333333" cat "textbook"> <title lang="eng">Intro. to Databases</title> <price unit="usd">39.00</price> </book> </bookstore>


Слайд 109

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 //@lang Selects the document root node ././. Selects all the book element nodes /bookstore//@lang/../.. Selects the empty set ./book/tilte/@lang


Слайд 110

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 /bookstore/book/title/..//@*


Слайд 111

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()


Слайд 112

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


Слайд 113

Примеры использования предикатов 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()]


Слайд 114

Упражнение на XPath выражения Задача: найти title и isbn книг, которые не fiction и стоят (цена, price) более чем 50 USD. <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <!-- a bookstore database --> <book isbn=“111111” cat=“fiction”> <!-- a particular book --> <title lang=“chn”>Harry Potter</title> <price unit=“us”>79.99</price> </book> <book isbn=“222222” cat=“textbook”> <title lang=“eng”>Learning XML</title> <price unit=“us”>69.95</price> </book> <book isbn="333333" cat="textbook"> <title lang="eng">Intro. to Databases</title> <price unit="usd">39.00</price> </book> </bookstore> Ответ: /bookstore/book[attribute::cat!="fiction" and price>50.00]/title | /bookstore/book[attribute::cat!="fiction" and price>50.00]/@isbn


Слайд 115

Упражнение на XPath выражения Задача: find average price of textbooks. <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <!-- a bookstore database --> <book isbn=“111111” cat=“fiction”> <!-- a particular book --> <title lang=“chn”>Harry Potter</title> <price unit=“us”>79.99</price> </book> <book isbn=“222222” cat=“textbook”> <title lang=“eng”>Learning XML</title> <price unit=“us”>69.95</price> </book> <book isbn="333333" cat="textbook"> <title lang="eng">Intro. to Databases</title> <price unit="usd">39.00</price> </book> </bookstore> Ответ: sum(/bookstore/book[attribute::cat="textbook"]/price/number(text())) div count(/bookstore/book[attribute::cat=“textbook”]/price)


Слайд 116

Question: find the titles of textbooks on XML. <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <!-- a bookstore database --> <book isbn=“111111” cat=“fiction”> <!-- a particular book --> <title lang=“chn”>Harry Potter</title> <price unit=“us”>79.99</price> </book> <book isbn=“222222” cat=“textbook”> <title lang=“eng”>Learning XML</title> <price unit=“us”>69.95</price> </book> <book isbn="333333" cat="textbook"> <title lang="eng">Intro. to Databases</title> <price unit="usd">39.00</price> </book> </bookstore> Answer: /bookstore/book[attribute::cat="textbook" and contains(title, "XML")]/title/text()


Слайд 117

Корневой маршрут Простейшим маршрутом поиска является тот, который указывает на корневой узел документа. Этот маршрут представляет собой просто наклонную черту "/". Например, данный шаблон XSLT использует образец XPath “/” для выбора всего дерева входного документа и заключения его в элемент html:  <xsl:template match="/"> <html><xsl:apply-templates/></html> </xsl:template>   Наклонная черта "/" – это абсолютный маршрут поиска, так как независимо от контекстного узла, независимо от того, в каком месте входного документа применен данный шаблон, он всегда обозначает одно и тоже: корневой узел документа.


Слайд 118

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


Слайд 119

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


Слайд 120

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


Слайд 121

Пример простой таблицы стилей <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:template match="people"> <xsl:apply-templates select="person"/> </xsl:template> <xsl:template match="person"> <xsl:value-of select="name"/> </xsl:template> </xsl:stylesheet> Рассмотрим шаблон для элемента person. Процессор XSLT дважды активизирует этот шаблон, по одному разу на каждый узел person в документе. В первый раз контекстным узлом является элемент person Алана Тьюринга. Во второй раз контекстным узлом становится элемент person Ричарда Фейнмана. При активизации одного и того же шаблона для различных контекстных узлов выражение XPath в <xsl:value-of select="name"/> каждый раз обращается к разным элементам, и поэтому результаты его работы различаются.


Слайд 122

Маршруты к атрибутам Для выбора определенного атрибута элемента, используйте знак @, за которым следует имя нужного атрибута. Например, выражение XPath “@born” выбирает атрибут «born» контекстного узла. <xsl:template match="/"> <html> <xsl:apply-templates select="people"/> </html> </xsl:template> <xsl:template match="people"> <table> <xsl:apply-templates select="person"/> </table> </xsl:template> <xsl:template match="person"> <tr> <td><xsl:value-of select="name" /></td> <td><xsl:value-of select="@born" /></td> <td><xsl:value-of select="@died" /></td> </tr> </xsl:template> Результат: Алан Тьюринг 1912 1954 Ричард М Фейнман 1918 1988


Слайд 123

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


Слайд 124

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


Слайд 125

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


Слайд 126

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


Слайд 127

Подстановочный элемент ‘*’ Звездочка ‘*’ соответствует любому узлу элемента, независимо от его типа (но не соответствует атрибутам и комментариям и пр.). Например, следующий шаблон XSLT говорит, что должны быть обработаны дочерние элементы всех элементов, однако никакие данные выводить не требуется: <xsl:template match="*"> <xsl:apply-templates select="*"/> </xsl:template> Звездочка не соответствует атрибутам, текстовым узлам, комментариям или узлам инструкций обработки. Поэтому в приведенном примере выдается информация только из дочерних элементов, у которых есть собственные шаблоны, переопределяющие данный. Перед звездочкой может присутствовать префикс пространства имен. В этом случае выбираются только элементы из указанного пространства имен. Например, svg:* соответствует всем элементам с тем же URI пространства имен, что и у префикса svg. Как правило, имеет значение именно URI, а не префикс. Префиксы в таблице стилей и исходном документе могут отличаться, но URI пространств имен должны совпадать.


Слайд 128

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


Слайд 129

Подстановочный элемент ‘@*’ Выражение ‘@*’ соответствует всем узлам атрибутов. Например, данный шаблон XSLT копирует значения всех атрибутов элемента person входного документа в элементы attributes выходного документа: <xsl:template match="person"> <attributes><xsl:apply-templates select="@*"/></attributes> </xsl:template>  К выражению можно добавить префикс пространства имен для выбора атрибутов конкретного пространства имен, подобно тому, как это делается с элементами. Например, @xlink:* соответствует всем атрибутам XLink, при условии, что префиксу xlink поставлено в соответствие пространство имен http://www.w3.org/1999/xlink. И опять имеет значение именно URI, а не фактически используемый префикс.


Слайд 130

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


Слайд 131

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


Слайд 132

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


Слайд 133

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


Слайд 134

Выбор текущего элемента с помощью точки Одинарная точка указывает на текущий узел. В XSLT она чаще всего используется, когда требуется получить значение текущего найденного элемента. Например, данный шаблон копирует содержимое каждого комментария из входного документа в элемент span выходного документа, выделяя его курсивом: <xsl:template match="comment()"> <span class="comment"><i><xsl:value-of select="."></i></span> </xsl:template>  Символ ‘.’ – значение атрибута select элемента xsl:value-of – обозначает найденный элемент. Эта схема одинаково хорошо подходит для узлов элементов, атрибутов и всех других видов узлов. Например, следующий шаблон выбирает элементы «name» из входного документа и копирует в выходной документ, выделяя их: <xsl:template match="name"> <strong><xsl:value-of select="."></strong> </xsl:template>


Слайд 135

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


Слайд 136

Выполнение сравнений Для выбора всех элементов «person», имеющих дочерний элемент «profession» со значением «физик» нужно использовать выражение “//person [profession="физик"]”. Если требуется найти элемент «person» с «id», равным “p4567”, то нужно задать перед именем атрибута символ ‘@’. Например, в выражении //person[@id="p4567"]. XPath кроме знака равенства поддерживает полный набор операторов сравнения, в том числе <, >, >=, <= и !=. Например, выражение //person[@born<=1976] ищет в документе все элементы person с атрибутом born, числовое значение которого меньше или равно 1976. Если < или <= используются внутри XML-документа, необходимо заменять знак «меньше» на “&lt;” Например <xsl:apply-templates select="//person[@born&lt;=1976]"/>. Однако, если выражение XPath находится вне XML-документа, как в некоторых случаях использования XPointer, знак «меньше» можно не заменять.


Слайд 137

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


Слайд 138

Выражение 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 имеет значение Алан.


Слайд 139

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


Слайд 140

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


Слайд 141

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


Слайд 142

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


Слайд 143

Пример XSLT преобразования с использованием полный синтаксиса <?xml version="1.0"?> <xsl:stylesheet version="1.0" mlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <!-- первый шаблон --> <dl> <xsl:apply-templates select="descendant::person"/> </dl> </xsl:template> <xsl:template match="person"> <!-- второй шаблон --> <dt><xsl:value-of select="child::name"/></dt> <dd> <ul> <xsl:apply-templates select="child::name/following-sibling::*"/> </ul> </dd> </xsl:template> <xsl:template match="*"> <!-- третий шаблон --> <li><xsl:value-of select="self::*"/></li> </xsl:template> <!-- четвертый шаблон --> <xsl:template match="homepage" xmlns:xlink="http://www.w3.org/1999/xlink"> <li><xsl:value-of select="attribute::xlink:href"/></li> </xsl:template> </xsl:stylesheet>


Слайд 144

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


Слайд 145

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


×

HTML:





Ссылка: