Лекция 04 (XPath)

advertisement
Кафедра «ОСУ»
Весенний семестр 2010/2011 уч. года
Языки описания информации
Лекция 4.
XPath
Язык XPath
XML Path Language 2.0
Язык XPath
•
•
•
Язык XPath используется для идентификации различных частей XML документов.
Язык XPath использует синтаксис отличный от XML синтаксиса.
XPath позволяет писать выражения, ссылающиеся на
–
–
–
–
•
С помощью выражений на языке XPath можно задавать узлы:
–
–
–
–
–
•
первый элемент «person»,
седьмой дочерний элемент третьего элемента «person»,
атрибут ID первого элемента «person», содержащий строку «Фред Джоунс»,
все инструкции обработки xml-stylesheet в прологе документа и т. д.
по положению,
по относительному положению,
по типу,
по содержимому
и другим критериям.
В выражениях XPath могут также использоваться числа, строки, логические
операции.
– Это позволяет в таблицах стилей XSLT выполнять простейшие арифметические вычисления для
нумерации и создания перекрестных ссылок.
•
Строковые операции в XPath позволяют XSLT выполнять такие задачи, как перевод
заголовка главы в верхний регистр в шапке при сохранении смешанного регистра в
ссылке в основном тексте.
Использование XPath
• XPath выражения используются:
– в XSLT преобразованиях с помощью XPath
выражений выполняется поиск и выбор
определенных элементов входного документа для
их последующего копирования в выходной
документ или дальнейшей обработки;
– в языке XPointer выражения на языке XPath
используются для идентификации определенной
точки или части XML документа, на который
ссылается язык XLink.
Древовидная структура XML
документа
•
•
•
•
•
•
XML документ представляет собой дерево, состоящее из узлов.
Некоторые узлы могут содержать другие узлы.
Один корневой узел в конечном счете включает в себя все остальные узлы.
XPath – это язык для выбора узлов и наборов узлов этого дерева.
С точки зрения XPath существует семь типов узлов:
1. Корневой узел
2. Узлы элементов
3. Текстовые узлы
4. Узлы атрибутов
5. Узлы комментариев
6. Узлы инструкций обработки
7. Узлы пространств имен
В этом списке нет таких конструкций, как секции CDATA, ссылки на сущности и
объявления типа документа. XPath работает с XML-документом уже после того, как
они объединены с документом.
– Например, XPath не сможет идентифицировать первую секцию CDATA в документе или
различить, включено ли данное значение атрибута непосредственно в начальный тег исходного
элемента или было взято как значение по умолчанию из объявления атрибута в DTD.
Пример XML документа
<?xml 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>M</middle_initial> <last_name>Фейнман</last_name>
</name>
<profession>физик</profession>
<hobby>Игра на бонгах</hobby>
</person>
</people>
Древовидная структура XML
документа
Взаимосвязи между узлами
• Parent (родитель) – узел «родителя» содержит
под-узлы «ребенка».
• Children (ребенок)
• Siblings (братья) – под-узлы имеющие одного
«родителя».
• Descendants (потомки) – все под-узлы ниже по
иерархии текущего узла.
• Ancestors (предки) – все под-узлы выше по
иерархии текущего узла.
Parent (родитель)
• Каждый элемент и атрибут имеет одного
«родителя»
• Например:
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
• Элемент “book” является родителем узлов: title,
author, year и price.
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».
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).
Ancestors (предки)
• Узлы «родители», их «родители» и т.д.
• Например:
<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
• предками элемента «title» являются элементы «book»
«bookstore».
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.
Особенности модели данных XPath
1. Корневой узел не совпадает с корневым элементом.
–
Корневой узел дерева содержит в себе весь документ, в том
числе корневой элемент, а также комментарии и инструкции
обработки, находящиеся перед начальным тегом корневого
элемента или после конечного тега корневого элемента.
•
В приведенном примере корневой узел содержит инструкцию
обработки xml-stylesheet и корневой элемент people.
2. Модель данных XPath включает не все, что есть в
документе.
–
В частности, XML-объявление и DTD не доступны через XPath.
3. Однако, если DTD предоставляет значения по умолчанию
для каких-либо атрибутов, XPath распознает эти атрибуты.
–
–
Например, элемент homepage имеет атрибут xlink:type,
предоставляемый DTD.
Разрешаются все ссылки на анализируемые сущности.
• Элемент homepage имеет атрибут xlink:type, предоставляемый DTD.
• Также разрешаются все ссылки на анализируемые сущности.
• Ссылки на сущности, символьные ссылки и секции CDATA не
различимы, хотя все данные, которые в них содержатся, доступны.
– Например, XSLT не позволит выделить жирным шрифтом весь текст в
секциях CDATA, потому что XPath не знает, какой текст является частью
секции CDATA, а какой не является.
• И наконец, атрибуты xmlns представляются в виде узлов
пространств имен.
– Они не рассматриваются как узлы атрибутов, хотя анализатор, не
знающий о пространствах имен, увидит их как атрибуты.
– Кроме того, эти узлы присоединяются к каждому узлу элементов и
атрибутов, относящемуся к области действия объявления, а не к
одному только узлу того элемента, в котором объявлено пространство
имен.
Маршруты поиска
• Самыми полезными выражениями XPath
являются маршруты поиска.
• Типы маршрутов поиска
– сокращенные маршруты поиска:
• простые маршруты:
– корневой маршрут - указывает на корневой узел документа
(/);
– маршруты к дочерним элементам - одиночное имя элемента
(имя-элемента);
– маршруты к атрибутам - для выбора определенного атрибута
элемента (@имя-атрибута);
– подстановочные элементы (*, node(), @*);
• составные маршруты (/,//, “.”, “..”):
– полные маршруты поиска.
• Маршрут поиска использует как минимум один шаг
для идентификации набора узлов документа.
• Этот набор может быть пустым, содержать один узел
или содержать несколько узлов.
• Узел может быть
1.
2.
3.
4.
5.
6.
7.
8.
корневым узлом,
узлом элементов,
узлом атрибутов,
узлом пространств имен,
узлом текста,
узлом комментариев,
узлом инструкцией обработки
Или любой их комбинацией.
Описание выражений
• / - Selects the document root node (absolute
path) node Selects the node (relative path)
• // - Selects all descendent nodes of the
current node that match the selection
• . - Selects the current node
• .. - Selects the parent of the current node
• @ - Selects attribute nodes
Пример 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>
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
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/..//@*
Синтаксис и семантика XPath
выражений
• Синтаксис
locationStep1/locationStep2/…
где:locationStep = axis::nodeSelector[predicate]
• Семантика
– Найти все вершины, описанные с помощью locationStep1
• Find all nodes specified by axis::nodeSelector
• Select only those that satisfy predicate
– Для каждой такой вершины N:
• Find all nodes specified by locationStep2 using N as the current node
• Объединить их
– For each node returned by locationStep2 do the same using
locationStep3, …
Полный набор осей
•
•
•
•
•
•
•
•
•
•
self ‐‐ the context node itself
child ‐‐ the children of the context node
descendant ‐‐ all descendants (children+)
parent ‐‐ the parent (empty if at the root)
ancestor ‐‐ all ancestors from the parent to the root
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
• 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()
Предикаты
• [position() op #], [last()]
– op: =, !=, <, >, <=, >=
– test position among siblings
• [attribute::name op “value"]
– op: =, !=, <, >, <=, >=
– test equality of an attribute
• [axis:nodeSelector]
– test pattern
Примеры использования предикатов
• Selects the first book element that is the child of the bookstore
element. /bookstore/book[1] или /bookstore/book[position()=1]
• Select book element nodes which has a child title element with lang
attribute value no equal to “eng”.
/bookstore/book[child::title/attribute::lang!="eng"]
• Selects the second to last book element /bookstore/book[last()-1]
• Selects all nodes which have an attr //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()]
Упражнение на 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
Упражнение на 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)
•
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()
Корневой маршрут
• Простейшим маршрутом поиска является тот, который
указывает на корневой узел документа. Этот маршрут
представляет собой просто наклонную черту "/".
• Например, данный шаблон XSLT использует образец XPath
“/” для выбора всего дерева входного документа и
заключения его в элемент html:
<xsl:template match="/">
<html><xsl:apply-templates/></html>
</xsl:template>
• Наклонная черта "/" – это абсолютный маршрут поиска, так
как независимо от контекстного узла, независимо от того, в
каком месте входного документа применен данный
шаблон, он всегда обозначает одно и тоже: корневой узел
документа.
Маршруты к дочерним элементам
• Второй простейший маршрут – это
одиночное имя элемента. Он позволяет
выбрать все дочерние элементы с
указанным именем.
– Например, выражение XPath “profession”
ссылается на все дочерние элементы
«profession» контекстного узла.
• Точный набор выбираемых элементов
зависит от контекстного узла, поэтому это
относительный маршрут XPath.
Пример ссылки на дочерние
элементы
• Если контекстным узлом является элемент «person» Алана
Тьюринга, тогда маршрут “profession” будет ссылаться на три
дочерних элемента profession:
<profession>специалист по информатике</profession>
<profession>математик</profession>
<profession>криптограф</profession>
• А если контекстным узлом является элемент «person» Ричарда
Фейнмана из того же примера, выражение XPath “profession” будет
ссылаться на единственный его дочерний элемент «profession»:
<profession>физик</profession>
• Если контекстным узлом является дочерний элемент «name»
элемента «person» Ричарда Фейнмана или Алана Тьюринга, тогда
данный маршрут XPath не будет ссылаться ни на что, так как ни
один из элементов «name» не имеет дочерних элементов
«profession».
• В XSLT преобразовании контекстным узлом
выражения XPath, используемом в атрибуте
select элемента xsl:apply-templates и ему
подобных, является текущий найденный узел.
• Когда другие системы, такие как XPointer,
используют XPath, для определения
контекстного узла предоставляются другие
средства.
Пример простой таблицы стилей
<?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"/> каждый раз обращается к разным
элементам, и поэтому результаты его работы различаются.
Маршруты к атрибутам
• Для выбора определенного атрибута элемента, используйте знак @, за которым
следует имя нужного атрибута.
• Например, выражение 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
Функции для работы со специальными
узлами
• Для работы текстовыми узлами,
комментариями и инструкции обработки
используются специальные функции:
– text() – для получения значения текстового узла;
– comment() – для получения значения
комментария;
– processing-instruction() – для получения значения
инструкции обработки.
• Значением узла комментария является текст
комментария.
• Значением узла атрибута – значение атрибута.
• Значением узла инструкции обработки
являются данные инструкции обработки.
• Так как узлы комментариев и текстовые узлы не имеют имен,
функциям comment() и text() соответствует любой комментарий или
текстовый узел, являющийся непосредственным дочерним узлом
контекстного узла.
• Каждый комментарий является отдельным узлом комментария.
• Каждый текстовый узел содержит максимально возможный
непрерывный отрезок текста, не прерванный тегом. Ссылки на
сущности и секции CDATA заменяются на текст и разметку и не
разбивают текстовые узлы.
• По умолчанию таблицы стилей XSLT обрабатывают текстовые узлы,
но пропускают узлы комментариев.
• Можно добавить в таблицу стилей XSLT шаблон для комментария, и
тогда комментарии также будут обработаны.
• Следующий шаблон меняет каждый комментарий на текст
«Комментарий удален», выделенный курсивом:
<xsl:template match="comment( )">
<i>Комментарий удален</i>
</xsl:template>
Подстановочные выражения
• Подстановочные выражения позволяют
выбирать несколько типов элементов и узлов
одновременно.
• Существует три подстановочных выражения:
– звездочка ‘*’ – соответствует любому узлу
элемента, независимо от его типа.
– node() – соответствующее всем узлам: элементов,
текста, атрибутов, инструкций обработки,
пространств имен и комментариев.
– ‘@*’ – соответствует всем узлам атрибутов. .
Подстановочный элемент ‘*’
• Звездочка ‘*’ соответствует любому узлу элемента, независимо от его типа
(но не соответствует атрибутам и комментариям и пр.).
• Например, следующий шаблон XSLT говорит, что должны быть обработаны
дочерние элементы всех элементов, однако никакие данные выводить не
требуется:
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
• Звездочка не соответствует атрибутам, текстовым узлам, комментариям
или узлам инструкций обработки.
– Поэтому в приведенном примере выдается информация только из дочерних
элементов, у которых есть собственные шаблоны, переопределяющие данный.
• Перед звездочкой может присутствовать префикс пространства имен. В
этом случае выбираются только элементы из указанного пространства
имен.
– Например, svg:* соответствует всем элементам с тем же URI пространства имен,
что и у префикса svg.
• Как правило, имеет значение именно URI, а не префикс. Префиксы в
таблице стилей и исходном документе могут отличаться, но URI
пространств имен должны совпадать.
Подстановочный элемент node()
• node() – это подстановочное выражение,
соответствующее, в отличии от ‘*’, всем
узлам:
– элементов,
– текста,
– атрибутов,
– инструкций обработки,
– пространств имен и
– комментариев.
Подстановочный элемент ‘@*’
• Выражение ‘@*’ соответствует всем узлам атрибутов.
• Например, данный шаблон 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, а не фактически используемый
префикс.
Составные маршруты поиска
• Рассмотренные выражения XPath (имена элементов, @ плюс имя
атрибута, ‘/’) являются одиночными шагами поиска.
• Эти шаги поиска можно объединять с помощью косой черты,
перемещаясь вниз по иерархии от найденного узла к другим
узлам.
• Можно также использовать
– точку ‘.’ для ссылки на текущий узел,
– две точки ‘..’ для ссылки на родительский узел
– двойной слэш ‘//’ для ссылки на потомков контекстного узла.
• Символ ‘/’ объединяет различные шаги в составной маршрут
поиска.
• Каждый шаг в маршруте является относительным по отношению к
предшествующему.
– Если маршрут начинается с ‘/’, первый шаг является относительным по
отношению к корневому узлу.
– В противном случае он является относительным по отношению к
контекстному узлу.
Пример сложного маршрута с помощью
наклонной черты
• Пример: выражение /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.
Выбор всех потомков
• Для выбора всех потомков используется двойная косая
черта.
• Двойная наклонная черта ‘//’ выбирает всех потомков
контекстного узла, а также сам контекстный узел.
• В начале выражения XPath эти символы позволяют
выбрать всех потомков корневого узла.
– Например, выражение XPath ‘//name’ выбирает в
документе все элементы name.
• Выражение ‘person//@id’ выбирает все атрибуты «id»
всех элементов, содержащихся в дочернем элементе
«person» контекстного узла.
Выбор родительского элемента
• Родительский элемент можно выбрать с помощью двойной
точки.
• Две точки ‘..’ обозначают родителя текущего узла.
– Например, выражение 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>.
Выбор текущего элемента с
помощью точки
• Одинарная точка указывает на текущий узел.
• В 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>
Предикаты
• В общем случае выражение XPath может ссылаться более чем на
один узел. Иногда это именно то, что требуется, однако в некоторых
случаях приходится просеивать набор узлов, возвращаемый
выражением, чтобы выбрать только несколько из них.
• Каждый шаг в маршруте поиска может иметь предикат, который
делает выбор из текущего на данном шаге выражения списка узлов.
• Предикат содержит логическое выражение, которое проверяется
для каждого узла в контекстном списке узлов. Если выражение
ложно, этот узел удаляется из списка, в противном случае –
сохраняется.
– Предположим, например, что требуется найти все элементы
«profession», которые имеют значение физик.
– Выражение XPath //profession[.="физик"] находит все такие элементы.
Здесь точка обозначает строковое значение текущего узла, то есть то
же, что возвращает элемент xsl:value-of.
• Можно использовать одинарные кавычки вместо двойных, когда
выражение XPath помещено внутрь значения атрибута, уже
находящегося в кавычках.
– Например <xsl:template match="//profession[.='физик']">.
Выполнение сравнений
• Для выбора всех элементов «person», имеющих дочерний элемент
«profession» со значением «физик» нужно использовать выражение
“//person [profession="физик"]”.
• Если требуется найти элемент «person» с «id», равным “p4567”, то
нужно задать перед именем атрибута символ ‘@’.
– Например, в выражении //person[@id="p4567"].
• XPath кроме знака равенства поддерживает полный набор
операторов сравнения, в том числе <, >, >=, <= и !=.
– Например, выражение //person[@born<=1976] ищет в документе все
элементы person с атрибутом born, числовое значение которого меньше
или равно 1976.
• Если < или <= используются внутри XML-документа, необходимо
заменять знак «меньше» на “<”
– Например <xsl:apply-templates select="//person[@born<=1976]"/>.
• Однако, если выражение XPath находится вне XML-документа, как в
некоторых случаях использования XPointer, знак «меньше» можно не
заменять.
Использование логических
операций
• XPath также предусматривает логические
операторы and и or для логического
объединения выражений.
– Пример 1: выбрать все элементы person, значения
атрибутов born которых находятся между 1910 и
1920 включительно.
//person[@born<=1920 and @born>=1910]
– Пример 2: выбрать все элементы name, имеющие
дочерние элементы first_name со значением
Ричард или Дик.
//name[first_name="Ричард" or first_name="Дик"]
• Выражение XPath “//name” выбирает все элементы «name».
• Выражение “//name[middle_initial]” выбирает все элементы «name»
и затем проверяет каждый из них на наличие дочернего элемента
middle_initial. Сохраняются только те элементы, в которых есть такой
дочерний элемент.
– Например, //name[middle_initial] выберет элемент «name» Ричарда М.
Фейнмана, но не выберет «name» Алана Тьюринга.
• Любой или все шаги в маршруте поиска могут иметь предикаты.
– Например, выражение
“/people/person[@born < 1950]/name[first_name="Алан"]”
– сначала выбирает все дочерние элементы people корневого узла (в
примере такой только один).
– Затем он выбирает из этих элементов все элементы person, атрибуты
born которых имеют числовое значение меньше 1950.
– И наконец, из этой группы элементов отбираются все дочерние
элементы name, у которых дочерний элемент first_name имеет
значение Алан.
Полные маршруты поиска
• Ранее рассмотренные маршруты называются «сокращенными
маршрутами поиска». Именно они лучше всего подходят для масок
поиска XSLT.
• В XPath также определен полный синтаксис для полных маршрутов
поиска, который более многословен и более гибок.
• Каждый шаг в маршруте поиска имеет
– обязательные части
• ось поиска
• критерий узла,
– необязательная часть
• предикаты.
• Ось указывает направление перемещения от контекстного узла для
поиска следующих узлов.
• Критерий узла определяет, какие узлы по этой оси следует включать.
• Предикаты дополнительно отсеивают узлы в соответствии с
указанным в предикате выражением.
Схема полного маршрута поиска
Соотношение сокращенных и полных
маршрутов поиска
• В сокращенном маршруте поиска ось и критерий
узла объединены вместе.
• В полном маршруте они разделяются двумя
двоеточиями “::”.
– Например, сокращенный маршрут поиска
“people/person/@id” состоит из трех шагов.
• Первый шаг выбирает узлы элементов people по оси дочерних
узлов,
• Второй шаг – выбираются узлы элементов «person» по оси
дочерних узлов,
• Третий шаг – выбираются узлы атрибутов id по оси атрибутов.
– Если переписать это выражение в полной форме, тот
же маршрут поиска будет выглядеть следующим
образом:
“child::people/child::person/attribute::id”.
Соотношение сокращенных и полных
маршрутов поиска (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 позволяют выбирать узлы.
Оси поиска
• В языке XPath понятие оси служит для того, чтобы выделить
в дереве документа различные подмножества узлов
относительно некоторого узла, называемого контекстным.
• В общем случае эти подмножества пересекаются, но оси
ancestor, descendant, following, preceding и self разбивают
документ на непересекающиеся части, в совокупности
содержащие все узлы (за исключением тех, что
соответствуют пространствам имен и атрибутам).
• Контекстный узел устанавливается языком, в который
погружен XPath.
• В случае XSLT контекстный узел устанавливают следующие
конструкции:
– сопоставление с шаблоном
<xsl:template match="x">…</xsl:template>;
– оператор xsl:for-each;
– оператор xsl:apply-templates.
Оси сокращенного синтаксиса
• Сокращенный синтаксис позволяет
перемещаться по следующим осям:
– ось дочерних узлов (child),
– ось родительских узлов (parent),
– собственная оси (self),
– ось атрибутов (attribute) и
– оси потомков с включением контекстного узла
(descendant-or-self).
Дополнительные оси полного
синтаксиса
Полный синтаксис добавляет еще восемь осей:
1. Ось предков (ancestor) - Все узлы элементов, содержащие контекстный узел;
родительский узел, родитель родителя, родитель родителя родителя и т.д. вверх
вплоть до корневого узла в порядке, обратном расположению узлов в документе.
2. Ось следующих одноуровневых узлов (following-sibling) - Все узлы, следующие за
контекстным узлом и содержащиеся в том же узле родительского элемента, в том же
порядке, в каком узлы присутствуют в документе.
3. Ось предыдущих одноуровневых узлов (preceding-sibling) - Все узлы,
предшествующие контекстному узлу и содержащиеся в том же узле родительского
элемента, в порядке, обратном порядку в документе.
4. Ось следующих узлов (following) - Все узлы, следующие после контекстного узла, в том
же порядке, в каком узлы присутствуют в документе.
5. Ось предыдущих узлов (preceding) - Все узлы, предшествующие началу контекстного
узла, в порядке, обратном порядку в документе.
6. Ось пространств имен (namespace) - Все пространства имен в области действия
контекстного узла, объявленные либо в контекстном узле, либо в одном из его
предков.
7. Ось потомков (descendant) - Все потомки контекстного узла, исключая сам
контекстный узел.
8. Ось предков, включая контекстный узел (ancestor-or-self) - Все предки контекстного
узла, включая сам контекстный узел.
Пример XSLT преобразования с
использованием полный синтаксиса
<?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>
Пояснение примера
• Первый шаблон соответствует корневому узлу.
– Он применяет шаблоны ко всем потомкам корневого узла, являющимся
элементами person, то есть перемещается от корневого узла по оси потомков
(descendant) с критерием узла person.
• Второй шаблон соответствует элементам person.
– Он помещает дочерние элементы name каждого элемента person в элемент dt.
– (Использованный здесь маршрут поиска, child::name, может быть переписан и в
сокращенной форме – в виде одного слова name.)
– Далее шаблоны применяются ко всем элементам, следующим за элементом
name на том же уровне иерархии.
– Шаблон начинает обработку с контекстного узла person, затем перемещается по
оси дочерних элементов в поисках элемента name.
– Отсюда процессор перемещается по оси следующих одноуровневых узлов
(following-sibling) и ищет элементы любого типа (*) после элемента name, также
являющиеся дочерними для того же элемента person.
– Для оси following-sibling не существует сокращенного эквивалента, и потому это
действительно простейший способ написания данной конструкции.
Пояснение примера (2)
• Третий шаблон
– выбирает любые элементы, не подходящие для других шаблонов; он
просто помещает такие элементы в элемент li.
– Выражение XPath self::* выбирает значение текущего найденного
элемента, то есть контекстного узла.
– Это выражение можно сократить до символа «точка».
• Четвертый (последний) шаблон
– выбирает элементы homepage.
– В этом случае требуется выбрать значение атрибута xlink:href, поэтому
от контекстного узла homepage мы перемещаемся по оси атрибутов.
– Критерий узлов выбирает атрибуты xlink:href.
– Точнее, он ищет атрибут с локальным именем href, префиксу которого
поставлено в соответствие URI пространства имен
http://www.w3.org/1999/xlink.
Общие выражения 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 и в предикатах маршрутов
поиска.
Функции XPath
• Язык XPath предоставляет много функций,
которые могут оказаться полезными в
предикатах или в обычных выражениях.
• Любая функция XPath возвращает значение,
относящееся к одному из четырех типов:
– логическое значение;
– числовое значение;
– набор узлов;
– строка.
Функции для наборов узлов
• Функции для наборов узлов либо используют, либо
возвращают информацию о наборах узлов –
упорядоченных коллекциях узлов XPath.
– функция position() - возвращает положение
контекстного узла;
– функция last() - возвращает количество узлов в
контекстном наборе, которое совпадает с позицией
последнего узла набора;
– функция count() - возвращает количество узлов своего
аргумента, а не контекстного списка.
• Например, “count(//name)” подсчитывает, сколько
элементов «name» присутствует в документе.
Функция position()
• Функция position() возвращает в виде числа
положение текущего узла в контекстном
списке.
– Например, шаблон XSLT используюет функцию
position() для вычисления номера
обрабатываемого элемента person
относительно других узлов контекстного
списка:
<xsl:template match="person">
Person <xsl:value-of select="position()"/>, <xsl:value-of
select="name"/>
</xsl:template>
Функция id()
• Функция id() принимает в качестве аргумента строку,
состоящую из одного или более ID, разделенных пробельными
символами, и возвращает набор узлов, который содержит все
узлы документа, имеющие указанные ID.
• Это узлы, атрибуты которых объявлены в DTD как
принадлежащие к типу ID, но они не обязательно имеют имя ID
или id.
• Например, id('p342') указывает в примере на элемент person
Алана Тьюринга, а id('p342 p4567') – на оба элемента person, как
Алана Тьюринга, так и Ричарда Фейнмана.
• Функция id() чаще всего используется в сокращенном
синтаксисе XPath.
• Она позволяет формировать абсолютные маршруты поиска,
начинающиеся не от корня.
– Например, id('p342')/name ссылается на элемент name Алана
Тьюринга независимо от расположения в документе элемента
person Алана Тьюринга, пока у этого элемента сохраняется ID.
Введение в язык XPath
• XPath is a language for finding information in an XML
document.
–
–
–
–
–
XPath is a syntax for defining parts of an XML document
XPath uses path expressions to navigate in XML documents
XPath contains a library of standard functions
XPath is a major element in XSLT
XPath is a W3C recommendation
XPath Versions
•
•
•
•
XPath 1.0 became a W3C Recommendation November 16, 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
Specification
Draft / Proposal
XPath 1.0
XPath 2.0 Requirements
Recommendation
16. Nov 1999
03. Jun 2005
XPath 2.0 Language
23. Jan 2007
XPath 2.0 Functions
23. Jan 2007
XPath 2.0 Data Model
23. Jan 2007
XPath 2.0 Semantics
23. Jan 2007
XPointer
16. Aug 2002
XPath Path Expressions
• XPath uses path expressions to select nodes or node-sets in an XML
document. These path expressions look very much like the expressions
you see when you work with a traditional computer file system.
• XPath is Used in XSLT
– XPath is a major element in the XSLT standard. Without XPath knowledge you
will not be able to create XSLT documents.
• XQuery and XPointer are both built on XPath expressions. XQuery 1.0 and
XPath 2.0 share the same data model and support the same functions and
operators.
• XPATH is a W3C Recommendation
• XPath became a W3C Recommendation 16. November 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.
Терминология 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)
Atomic values
• Atomic values are nodes with no children or
parent.
• Example of atomic values:
– J K. Rowling
– "en"Items
• Items are atomic values or nodes.
Взаимосвязи между узлами
•
Parent
– Each element and attribute has one parent.
– In the following example; the book element is the parent of the title, author, year, and price:
<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>
Взаимосвязи между узлами (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>
Взаимосвязи между узлами (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>
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>
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:
Expression
nodename
/
//
.
..
@
Description
Selects all child nodes of the named node
Selects from the root node
Selects nodes in the document from the current node
that match the selection no matter where they are
Selects the current node
Selects the parent of the current node
Selects attributes
• In the table below we have listed some path expressions and the
result of the expressions:
Path Expression Result
bookstore
/bookstore
Selects all the child nodes of the bookstore element
Selects the root element bookstore
Note: If the path starts with a slash ( / ) it always represents an
absolute path to an element!
bookstore/book Selects all book elements that are children of bookstore
//book
Selects all book elements no matter where they are in the
document
bookstore//book Selects all book elements that are descendant of the bookstore
element, no matter where they are under the bookstore element
//@lang
Selects all attributes that are named lang
Предикаты
• Predicates are used to find a specific node or a node that contains a
specific value.
• Predicates are always embedded in square brackets.
• In the table below we have listed some path expressions with predicates
and the result of the expressions:
Path Expression
Result
/bookstore/book[1]
Selects the first book element that is the child of the bookstore
element.Note: IE5 and later has implemented that [0] should be the first
node, but according to the W3C standard it should have been [1]!!
/bookstore/book[last()]
Selects the last book element that is the child of the bookstore element
/bookstore/book[last()-1]
Selects the last but one book element that is the child of the bookstore
element
Selects the first two book elements that are children of the bookstore
element
Selects all the title elements that have an attribute named lang
/bookstore/book[position()<3]
//title[@lang]
//title[@lang='eng']
/bookstore/book[price>35.00]
Selects all the title elements that have an attribute named lang with a
value of 'eng'
Selects all the book elements of the bookstore element that have a price
element with a value greater than 35.00
/bookstore/book[price>35.00]/title Selects all the title elements of the book elements of the bookstore
element that have a price element with a value greater than 35.00
Выбор неизвестных узлов
• XPath wildcards can be used to select unknown XML elements.
Wildcard
*
@*
node()
•
Description
Matches any element node
Matches any attribute node
Matches any node of any kind
In the table below we have listed some path expressions and the result of the
expressions:
Path Expression
/bookstore/*
//*
//title[@*]
Result
Selects all the child nodes of the bookstore element
Selects all elements in the document
Selects all title elements which have any attribute
Выбор нескольких путей
• By using the | operator in an XPath expression you can select several
paths.
• In the table below we have listed some path expressions and the result of
the expressions:
Path Expression
//book/title | //book/price
//title | //price
/bookstore/book/title |
//price
Result
Selects all the title AND price elements of all
book elements
Selects all the title AND price elements in
the document
Selects all the title elements of the book
element of the bookstore element AND all
the price elements in the document
XPath Axes
• The XML Example Document
<?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>
XPath Axes
• An axis defines a node-set relative to the current node.
AxisName
ancestor
Result
Selects all ancestors (parent, grandparent, etc.) of the current node
ancestor-or-self
Selects all ancestors (parent, grandparent, etc.) of the current node and
the current node itself
Selects all attributes of the current node
Selects all children of the current node
Selects all descendants (children, grandchildren, etc.) of the current node
attribute
child
descendant
descendant-or-self
following
following-sibling
namespace
parent
preceding
preceding-sibling
self
Selects all descendants (children, grandchildren, etc.) of the current node
and the current node itself
Selects everything in the document after the closing tag of the current
node
Selects all siblings after the current node
Selects all namespace nodes of the current node
Selects the parent of the current node
Selects everything in the document that is before the start tag of the
current node
Selects all siblings before the current node
Selects the current node
Location Path Expression
• A location path can be absolute or relative.
– An absolute location path starts with a slash ( / ) and
– a relative location path does not.
• In both cases the location path consists of one or more steps,
each separated by a slash:
– An absolute location path: /step/step/...
– A relative location path: step/step/...
• Each step is evaluated against the nodes in the current nodeset.
• A step consists of:
– an axis (defines the tree-relationship between the selected nodes
and the current node)
– a node-test (identifies a node within an axis)
– zero or more predicates (to further refine the selected node-set)
• The syntax for a location step is:
– axisname::nodetest[predicate]
Примеры
• Примеры Location Path Expression
Example
child::book
attribute::lang
Result
Selects all book nodes that are children of the current
node
Selects the lang attribute of the current node
child::*
Selects all children of the current node
attribute::*
Selects all attributes of the current node
child::text()
Selects all text child nodes of the current node
child::node()
Selects all child nodes of the current node
descendant::book
Selects all book descendants of the current node
ancestor::book
Selects all book ancestors of the current node
ancestor-or-self::book Selects all book ancestors of the current node - and the
current as well if it is a book node
child::*/child::price
Selects all price grandchildren of the current node
Операции XPath
•
Список операций, которые могут быть использованы в XPath выражениях:
Операция Описание
|
Объединяет два набора узлов
Пример
Возвращаемое значение
//book | //cd
+
*
div
=
Addition
Subtraction
Multiplication
Division
Equal
6+4
Returns a node-set with all book and
cd elements
10
6-4
2
6*4
24
8 div 4
2
price=9.80
!=
Not equal
price!=9.80
<
Less than
price<9.80
<=
Less than or equal to
price<=9.80
>
Greater than
price>9.80
>=
Greater than or equal to
price>=9.80
or
or
and
and
mod
Modulus (division remainder)
price=9.80 or
price=9.70
price>9.00 and
price<9.90
5 mod 2
true if price is 9.80
false if price is 9.90
true if price is 9.90
false if price is 9.80
true if price is 9.00
false if price is 9.80
true if price is 9.00
false if price is 9.90
true if price is 9.90
false if price is 9.80
true if price is 9.90
false if price is 9.70
true if price is 9.80
false if price is 9.50
true if price is 9.80
false if price is 8.50
1
Пример 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>
Загрузка 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);
<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>
Примеры
• 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
Download