Объединить предикат XPATH с позицией - PullRequest
7 голосов
/ 10 февраля 2011

У меня есть коллекция элементов div, которые имеют класс media-gallery-item.
Я бы хотел выбрать номер элемента x.

При выборе всех элементов я получаю 5 результатов

$x("//div[@id='content-area']//div[@class='media-gallery-item']")

Теперь я хочу иметь возможность выбрать элемент № 2, но я не могу понять, как правильно их объединить:

$x("//div[@id='content-area']//div[@class='media-gallery-item'][2]")

$x("//div[@id='content-area']//div[@class='media-gallery-item'
                                   and position() = 2]")

Я знаю, что это не так уж многосмысл, поскольку это не фактический AND, а скорее как: «сначала отфильтруйте по этому, затем выберите 2-е совпадение».Цель этого состоит в том, чтобы продолжать выбирать вещи (например, во втором элементе, получите мне атрибут href элемента a)

Ответы [ 3 ]

11 голосов
/ 10 февраля 2011

Пошаговый ответ.

Чтобы выбрать элементы с предком div[@id='content-area'], которые являются вторыми дочерними элементами их соответствующих родителей, используйте:

//div[@id='content-area']//div[2]

Для выбора второго (в порядке документа) div элемент с div[@id='content-area'] использованием предка:

(//div[@id='content-area']//div)[2]

Обратите внимание на разницу.

Затем выберите элементы, которыеВторые дети их соответствующих родителей, при условии, что у них есть класс 'media-gallery-item', используют:

//div[@id='content-area']//div[2][@class='media-gallery-item']

, чтобы выбрать элементы, которые являются вторыми из тех детей (их соответствующих родителей), которые имеютclass media-gallery-item:

//div[@id='content-area']//div[@class='media-gallery-item'][2]

Чтобы выбрать второй (в порядке документа) элемент div с предком div[@id='content-area'], при условии, что он имеет media-gallery-item класс:

(//div[@id='content-area']//div)[2][@class='media-gallery-item']

Чтобы выбрать второй (в порядке документа) из всех элементов div с предком div[@id='content-area'] и классом media-gallery-item:

(//div[@id='content-area']//div)[@class='media-gallery-item'][2]

Спецификационные кавычки в соответствии с предложением @Alejandro:

Предикат фильтрует набор узлов относительно оси, чтобы создать новый набор узловт.Для каждого узла в наборе узлов, подлежащем фильтрации, PredicateExpr оценивается с этим узлом в качестве узла контекста, с числом узлов в наборе узлов в качестве размера контекста и с позицией близости узла в узле-установка относительно оси как контекстная позиция

http://w3.org/TR/xpath/#predicates

Положение близости элемента набора узлов относительноось определяется как позиция узла в наборе узлов, упорядоченном в порядке документа, если ось является передней осью, и упорядочена в обратном порядке документа, если ось является обратной осью

http://w3.org/TR/xpath/#dt-proximity-position

Суть в том, что предикат позиции работает относительно оси.И вам нужно скобки, чтобы явно объявить приоритет.Таким образом, при расчете позиции будет учитываться не ось child, а набор узлов после разрешения оси descendant-or-self.

0 голосов
/ 10 февраля 2011

Похоже, вы неправильно обращаетесь к атрибутам. Попробуйте использовать

/div[@id='content-area' and @class='media-gallery-item'][2]
0 голосов
/ 10 февраля 2011

Получается: скобка!

(//div[@id='content-area']//div[@class='media-gallery-item'])[2] 

работает

...