синтаксис для предка :: в выражении Xpath - PullRequest
0 голосов
/ 14 февраля 2020

xpath -e '//attribute::vo/../text()' books.xml

возвращает содержимое каждого элемента, имеющего атрибут с именем vo.

Например, с этим book.xml:

<bookstore>
<book category="cooking">
  <title lang="en" vo="it">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" vo="fr">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>

тогда запрос:

xpath -e '//attribute::vo/../text()' books.xml

дает:

Found 2 nodes in /tmp/books.xml:
-- NODE --
Everyday Italian
-- NODE --
XQuery Kick Start

Каким должен быть синтаксис запроса с тем же результатом, но с ancestor:: на месте ..?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Если вы все еще хотите знать, как работает ancestor, он принимает родителя текущего узла, прародителя текущего узла и т. Д. До root. Таким образом, ваш запрос с ancestor будет выглядеть так:

//attribute::vo/ancestor::*[1]/title/text()

Где ancestor означает, что вы собираетесь собрать всех (великих) родителей, * означает, что вам не важно, какие узлы эти (великие) родители были бы, и [1] означает, что вам нужен «ближайший» к текущему узлу.

Тот же результат будет получен с помощью следующего запроса:

//attribute::vo/ancestor::book/title/text()

Так как он не принимает элемент root, потому что это не book узел. Таким образом, у нас здесь «плоская» иерархия.

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

//attribute::vo/ancestor::book[@category='web']/title/text()

1 голос
/ 14 февраля 2020

Я понимаю, что //attribute::vo/../text() не является естественным выражением Xpath.

//*[@vo]/text() лучше.

Так что нет необходимости вводить ancestor:: или parent:: вместо ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...