Примеры 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 &gt; 50]

Все элементы <author>, имеющие дочерний элемент <last-name> со значением Bob и одноуровневый элемент <price> со значением выше 50.

book[position() &lt;= 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() &lt; 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

См. также

Справочник

Примеры путей расположения

Основные понятия

Образец XML-файла с синтаксисом XPath (inventory.xml)