'

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

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





Слайд 0

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


Слайд 1

Язык XPath XML Path Language 2.0


Слайд 2

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


Слайд 3

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


Слайд 4

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


Слайд 5

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


Слайд 6

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


Слайд 7

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


Слайд 8

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


Слайд 9

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».


Слайд 10

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


Слайд 11

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


Слайд 12

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.


Слайд 13

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


Слайд 14

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


Слайд 15

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


Слайд 16

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


Слайд 17

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


Слайд 18

Описание выражений / - 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 node @ - Selects attribute nodes


Слайд 19

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


Слайд 20

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


Слайд 21

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


Слайд 22

Синтаксис и семантика 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, …


Слайд 23

Полный набор осей 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 descendant?or?self ?? the union of descendant and self ancestor?or?self ?? the union of ancestor and self following?sibling ?? siblings to the right preceding?sibling ?? 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


Слайд 24


Слайд 25

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


Слайд 26

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


Слайд 27

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


Слайд 28

Упражнение на 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


Слайд 29

Упражнение на 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)


Слайд 30

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


Слайд 31

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


Слайд 32

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


Слайд 33

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


Слайд 34

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


Слайд 35

Пример простой таблицы стилей <?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"/> каждый раз обращается к разным элементам, и поэтому результаты его работы различаются.


Слайд 36

Маршруты к атрибутам Для выбора определенного атрибута элемента, используйте знак @, за которым следует имя нужного атрибута. Например, выражение 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


Слайд 37

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


Слайд 38

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


Слайд 39

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


Слайд 40

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


Слайд 41

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


Слайд 42

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


Слайд 43

Подстановочный элемент ‘@*’ Выражение ‘@*’ соответствует всем узлам атрибутов. Например, данный шаблон 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, а не фактически используемый префикс.


Слайд 44

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


Слайд 45

Пример сложного маршрута с помощью наклонной черты Пример: выражение /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.


Слайд 46

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


Слайд 47

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


Слайд 48

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


Слайд 49

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


Слайд 50

Выполнение сравнений Для выбора всех элементов «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, знак «меньше» можно не заменять.


Слайд 51

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


Слайд 52

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


Слайд 53

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


Слайд 54

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


Слайд 55

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


Слайд 56

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


Слайд 57

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


Слайд 58

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


Слайд 59

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


Слайд 60

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


Слайд 61

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


Слайд 62

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


Слайд 63

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


Слайд 64

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


Слайд 65

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


Слайд 66

Функция position() Функция position() возвращает в виде числа положение текущего узла в контекстном списке. Например, шаблон XSLT используюет функцию position() для вычисления номера обрабатываемого элемента person относительно других узлов контекстного списка: <xsl:template match="person"> Person <xsl:value-of select="position()"/>, <xsl:value-of select="name"/> </xsl:template>


Слайд 67

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


Слайд 68

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


Слайд 69

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


Слайд 70


Слайд 71

Введение в язык 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


Слайд 72

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


Слайд 73

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 1999. 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.


Слайд 74

Терминология 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: <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore>   <book>     <title lang="en">Harry Potter</title>     <author>J K. Rowling</author>     <year>2005</year>     <price>29.99</price>  </book> </bookstore> Example of nodes in the XML document above: <bookstore> (root element node) <author>J K. Rowling</author> (element node) lang="en" (attribute node)


Слайд 75

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.


Слайд 76

Взаимосвязи между узлами 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: <book>   <title>Harry Potter</title>   <author>J K. Rowling</author>   <year>2005</year>   <price>29.99</price> </book> 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: <book>   <title>Harry Potter</title>   <author>J K. Rowling</author>   <year>2005</year>   <price>29.99</price> </book>


Слайд 77

Взаимосвязи между узлами (2) Siblings Nodes that have the same parent. In the following example; the title, author, year, and price elements are all siblings: <book>   <title>Harry Potter</title>   <author>J K. Rowling</author>   <year>2005</year>   <price>29.99</price> </book> 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: <bookstore> <book>   <title>Harry Potter</title>   <author>J K. Rowling</author>   <year>2005</year>   <price>29.99</price> </book> </bookstore>


Слайд 78

Взаимосвязи между узлами (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: <bookstore> <book>   <title>Harry Potter</title>   <author>J K. Rowling</author>   <year>2005</year>   <price>29.99</price> </book> </bookstore>


Слайд 79

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 <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book>   <title lang="eng">Harry Potter</title>   <price>29.99</price> </book> <book>   <title lang="eng">Learning XML</title>   <price>39.95</price> </book> </bookstore>


Слайд 80

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:


Слайд 81

In the table below we have listed some path expressions and the result of the expressions:


Слайд 82

Предикаты 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:


Слайд 83

Выбор неизвестных узлов XPath wildcards can be used to select unknown XML elements. In the table below we have listed some path expressions and the result of the expressions:


Слайд 84

Выбор нескольких путей 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:


Слайд 85

XPath Axes The XML Example Document <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book>   <title lang="eng">Harry Potter</title>   <price>29.99</price> </book> <book>   <title lang="eng">Learning XML</title>   <price>39.95</price> </book> </bookstore>


Слайд 86

XPath Axes An axis defines a node-set relative to the current node.


Слайд 87

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]


Слайд 88

Примеры Примеры Location Path Expression


Слайд 89

Операции XPath Список операций, которые могут быть использованы в XPath выражениях:


Слайд 90

Пример XML документа (books.xml) <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book category="COOKING">   <title lang="en">Everyday Italian</title>   <author>Giada De Laurentiis</author>   <year>2005</year>   <price>30.00</price> </book> <book category="CHILDREN">   <title lang="en">Harry Potter</title>   <author>J K. Rowling</author>   <year>2005</year>   <price>29.99</price> </book> <book category="WEB">   <title lang="en">XQuery Kick Start</title>   <author>James McGovern</author>   <author>Per Bothner</author>   <author>Kurt Cagle</author>   <author>James Linn</author>   <author>Vaidyanathan Nagarajan</author>   <year>2003</year>   <price>49.99</price> </book> <book category="WEB">   <title lang="en">Learning XML</title>   <author>Erik T. Ray</author>   <year>2003</year>   <price>39.95</price> </book> </bookstore>


Слайд 91

Загрузка 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);


Слайд 92

<html> <body> <script type="text/javascript"> 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<nodes.length;i++) { document.write(nodes[i].childNodes[0].nodeValue); document.write("<br />"); }} // code for Mozilla, Firefox, Opera, etc. else if (document.implementation && document.implementation.createDocument) { var nodes=xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null); var result=nodes.iterateNext(); while (result) { document.write(result.childNodes[0].nodeValue); document.write("<br />"); result=nodes.iterateNext(); } } </script> </body> </html>


Слайд 93

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


×

HTML:





Ссылка: