XPath: Как выбрать узел с некоторым атрибутом по индексу?

#xpath

#xpath

Вопрос:

У меня есть несколько узлов с некоторым определенным атрибутом, и мне нужно выбрать один из них по индексу. Например, мне нужно выбрать второй <div> с классом ‘test’ — //div[@class='test'][2] не работает.

Есть ли способ выбрать узел с некоторым атрибутом по индексу? Как это сделать?

Ответ №1:

Это часто задаваемые вопросы.

В XPath [] оператор имеет более высокий приоритет (сильнее привязывается), чем // псевдооператор.

Из-за этого выражение:

 //div[@class='test'][2]
  

выбирает все div элементы, у class которых есть атрибут «test» и которые ( div элементы) являются вторым таким div дочерним элементом своего родителя. Это не то, что вы хотите.

Использовать:

 (//div[@class='test'])[2]
  

Ответ №2:

Я полагаю, что согласно спецификации XML, считается, что атрибуты не имеют порядка.
Note that the order of attribute specifications in a start-tag or empty-element tag is not significant.
Смотрите здесь, я думаю, вам лучше всего изменить факторинг вашей структуры таким образом, чтобы порядок атрибутов ничего не описывал. Если вы можете предоставить более подробную информацию, мы могли бы предложить предложения.

РЕДАКТИРОВАТЬ: Перечитывая ваш пост, похоже, вы пытаетесь найти порядок узлов, а не порядок атрибутов. Порядок узлов разрешен, и ваш синтаксис выглядит нормально на первый взгляд. В каком программном обеспечении вы это делаете?

Комментарии:

1. Это была моя ошибка — анализатор скрыл теги. Я добавил правильное форматирование. Я использую расширение PHP DOM ua.php.net/manual/en/book.dom.php и, похоже, это расширение обеспечивает слабую реализацию XPath

2. Вы пробовали //div[@class='test'][position()=2]