Какая разница между // 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']
Ответы
Ответ 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
Помимо тщеславия, я не знаю никакой разницы.