Примеры XPath
В этом разделе проводится обзор синтаксических примеров, используемых в справочной документации по XPath.Все примеры используют образец XML-файла с синтаксисом XPath (inventory.xml).Пример использования выражения XPath в тестовом файле можно найти в подразделе «Пример использования объединений ( | )» в конце данного раздела.
Выражение |
Ссылается на |
---|---|
./author |
Все элементы <author> текущего контекста.Заметьте, что это эквивалентно выражению в следующей строке. |
author |
Все элементы <author> текущего контекста. |
first.name |
Все элементы <first.name> текущего контекста. |
/bookstore |
Элемент документа (<bookstore>) данного документа. |
//author |
Все элементы <author> данного документа. |
book[/bookstore/@specialty=@style] |
Все элементы <book>, для которых значение атрибута style равно значению атрибута specialty элемента <bookstore> корневого узла документа. |
author/first-name |
Все элементы <first-name>, являющиеся дочерними для элемента <author>. |
bookstore//title |
Все элементы <title> на первом или более глубоких уровнях элемента <bookstore> (наследники произвольного уровня).Заметьте отличие от выражения в следующей строке. |
bookstore/*/title |
Все элементы <title>, являющиеся "внуками" элементов <bookstore>. |
bookstore//book/excerpt//emph |
Все элементы <emph> в любом месте внутри элементов <excerpt>, дочерних по отношению к элементам <book>, находящимся в любом месте внутри элемента <bookstore>. |
.//title |
Все элементы <title> на первом или более глубоких уровнях текущего контекста.Учтите, что только в этой ситуации требуется нотация с использованием точек. |
author/* |
Все элементы, являющиеся дочерними для элементов <author>. |
book/*/last-name |
Все элементы <last-name>, являющиеся "внуками" элементов <book>. |
*/* |
Все элементы-"внуки" текущего контекста. |
*[@specialty] |
Все элементы с атрибутом specialty. |
@style |
Имя атрибута style текущего контекста. |
price/@exchange |
Атрибут exchange элементов <price> в текущем контексте. |
price/@exchange/total |
Возвращает пустой набор узлов, потому что атрибуты не содержат дочерних элементов.Такое выражение не запрещено грамматикой языка XPath, но, строго говоря, не является допустимым. |
book[@style] |
Все элементы <book> с атрибутами style в текущем контексте. |
book/@style |
Атрибут style для всех элементов <book> в текущем контексте. |
@* |
Все атрибуты контекста текущего элемента. |
./first-name |
Все элементы <first-name> текущего контекста.Заметьте, что это эквивалентно выражению в следующей строке. |
first-name |
Все элементы <first-name> текущего контекста. |
author[1] |
Все элементы <author> в контексте текущего узла. |
author[first-name][3] |
Третий элемент <author>, имеющий дочерний элемент <first-name>. |
my:book |
Элемент <book> из пространства имен my. |
my:* |
Все элементы из пространства имен my. |
@my:* |
Все атрибуты из пространства имен my (сюда не входят неквалифицированные атрибуты, принадлежащие элементам из пространства имен my). |
Следует заметить, что индексы задаются относительно родительского узла.Допустим, имеются следующие данные:
<x>
<y/>
<y/>
</x>
<x>
<y/>
<y/>
</x>
Выражение |
Ссылается на |
---|---|
x/y[1] |
Первый дочерний элемент <y> каждого элемента <x>.Это эквивалентно выражению в следующей строке. |
x/y[position() = 1] |
Первый дочерний элемент <y> каждого элемента <x>. |
(x/y)[1] |
Первый элемент <y> из всего набора элементов <y>, дочерних по отношению к элементам <x>. |
x[1]/y[2] |
Второй дочерний элемент <y> первого элемента <x>. |
Оставшиеся примеры относятся к «Образцу XML-файла с синтаксисом XPath».
Выражение |
Ссылается на |
---|---|
book[last()] |
Последний элемент <book> в контексте текущего узла. |
book/author[last()] |
Последний дочерний элемент <author> каждого элемента <book> в контексте текущего узла. |
(book/author)[last()] |
Последний элемент <author> из всего набора элементов <author>, дочерних по отношению к элементам <book> в контексте текущего узла. |
book[excerpt] |
Все элементы <book>, которые содержат хотя бы один дочерний элемент <excerpt>. |
book[excerpt]/title |
Все элементы <title>, дочерние по отношению к элементам <book> и содержащие хотя бы один дочерний элемент <excerpt>. |
book[excerpt]/author[degree] |
Все элементы <author>, содержащие по крайней мере один дочерний элемент <degree> и являющиеся дочерними для элементов <book>, содержащих по крайней мере один элемент <excerpt>. |
book[author/degree] |
Все элементы <book>, у которых есть дочерние элементы <author>, у которых, в свою очередь, есть хотя бы один дочерний элемент <degree>. |
author[degree][award] |
Все элементы <author>, которые содержат хотя бы один элемент <degree> и хотя бы один элемент <award>. |
author[degree and award] |
Все элементы <author>, которые содержат хотя бы один элемент <degree> и хотя бы один элемент <award>. |
author[(degree or award) and publication] |
Все элементы <author>, которые содержат хотя бы один дочерний элемент <degree> или <award> и хотя бы один дочерний элемент <publication>. |
author[degree and not(publication)] |
Все элементы <author>, содержащие по крайней мере один дочерний элемент <degree> и не содержащие дочерних элементов <publication>. |
author[not(degree or award) and publication] |
Все элементы <author>, содержащие по крайней мере один дочерний элемент <publication> и не содержащие ни элементов <degree>, ни элементов <award>. |
author[last-name = "Bob"] |
Все элементы <author>, которые содержат хотя бы один дочерний элемент <last-name> со значением Bob. |
author[last-name[1] = "Bob"] |
Все элементы <author>, первый дочерний элемент <last-name> которых имеет значение Bob.Заметьте, что это эквивалентно выражению в следующей строке. |
author[last-name [position()=1]= "Bob"] |
Все элементы <author>, первый дочерний элемент <last-name> которых имеет значение Bob. |
degree[@from != "Harvard"] |
Все элементы <degree>, у которых атрибут from не равен "Harvard". |
author[.= "Matthew Bob"] |
Все элементы <author> со значением Matthew Bob. |
author[last-name = "Bob" and ../price > 50] |
Все элементы <author>, имеющие дочерний элемент <last-name> со значением Bob и одноуровневый элемент <price> со значением выше 50. |
book[position() <= 3] |
Первые три книги (1, 2, 3). |
author[not(last-name = "Bob")] |
Все элементы <author>, не содержащие дочерних элементов <last-name> со значением Bob. |
author[first-name = "Bob"] |
Все элементы <author>, которые содержат хотя бы один дочерний элемент <first-name> со значением Bob. |
author[* = "Bob"] |
все элементы author, имеющие какой-либо дочерний элемент со значением Bob. |
author[last-name = "Bob" and first-name = "Joe"] |
Все элементы <author>, имеющие дочерний элемент <last-name> со значением Bob и дочерний элемент <first-name> со значением Joe. |
price[@intl = "Canada"] |
Все элементы <price> в контекстном узле, имеющие атрибут intl со значением "Canada". |
degree[position() < 3] |
Первые два элемента <degree>, являющиеся дочерними для контекстного узла. |
p/text()[2] |
Второй текстовый узел в каждом элементе <p> контекстного узла. |
ancestor::book[1] |
Ближайший элемент <book>, который является предком узла контекста. |
ancestor::book[author][1] |
Ближайший элемент <book>, который является предком узла контекста и содержит дочерний элемент <author>. |
ancestor::author[parent::book][1] |
Ближайший элемент <author>, который является предком в текущем контексте и является дочерним элементом для элемента <book>. |
Пример использования объединений (|)
Работу операции объединения можно продемонстрировать на примере следующего выражения XPath:
x | y/x
оно выбирает все элементы <x> со значениями green или blue из следующего XML-файла:
XML-файл (data1.xml)
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="union.xsl"?>
<root>
<x>green</x>
<y>
<x>blue</x>
<x>blue</x>
</y>
<z>
<x>red</x>
<x>red</x>
</z>
<x>green</x>
</root>
XSLT-файл (union.xsl)
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="root">
<xsl:for-each select="x | y/x">
<xsl:value-of select="."/>,
<xsl:if test="not(position()=last())">,</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Форматированный вывод
green,blue,blue,green
Вывод обработчика
<?xml version="1.0" encoding="UTF-16"?>green,blue,blue,green