Подтвердить что ты не робот

Какая разница между // node и/descendant:: node в xpath?

Я использую много XPath при размещении элементов на веб-страницах с использованием Selenium и ушел от использования node1//node2 в сторону использования node1/descendant:: node2 совсем недавно. Какая разница между этими двумя методами? Является ли более эффективным, чем другой?

Пример фрагмента XML для демонстрации:

<div id="books">
  <table>
    <tr><td class="title">Lord of the Rings</td><td class="author">JRR Tolkein</td></tr>
    <tr><td class="title">The Hitch-Hikers Guide to the Galaxy</td><td class="author">Douglas Adams</td></tr>
  </table>
</div>

Итак, это будет:

id('books')//td[@class='title']

или

id('books')/descendant::td[@class='title']
4b9b3361

Ответ 1

см. http://www.w3.org/TR/xpath#path-abbrev

//- это аббревиатура для оси потомка:: ось

Edit

Цитата:

//para является коротким для /descendant -or-self:: node()/child:: para

То есть, это относится ко всем парам, которые являются дочерними элементами контекста node или любого node, сгенерированного из контекста node. Насколько я могу судить, это переводится в любой абстракционный пункт контекста node.

Ответ 2

Есть разница в контекстной группе. //para[1] не подходит для /descendant-or-self::node()/child::para[1], который возвращает каждый пара, который является первым дочерним элементом его родителя. /descendant::para[1] возвращает только первый пара во всем поддереве.

Ответ 3

В вашем случае

 id('books')//td[@class='title']

и

 id('books')/descendant::td[@class='title']

возвращает тот же результат.

Но на самом деле, как уже было сказано ранее, id('books')//td[@class='title'] означает id('books')/descendant-or-self::node()/td[@class='title'], который отличается от id('books')/descendant::td[@class='title'] в концепции.

Обратите внимание на следующее примечание:

ПРИМЕЧАНИЕ. Путь расположения //para [1] не означает то же, что и путь/потомок местоположения:: para [1]. Последний выбирает первый элемент-абзац-потомка; первый выбирает все элементы-потомки, которые являются первыми пара детьми своих родителей.

эта заметка была взята из http://www.w3.org/TR/xpath#path-abbrev

Ответ 4

Помимо тщеславия, я не знаю никакой разницы.