XPath: поиск узла атрибута (и только одного) - PullRequest
4 голосов
/ 09 июля 2009

Что такое XPath, чтобы найти только ОДИН узел (какой бы ни), имеющий определенный атрибут (на самом деле меня интересует атрибут, а не узел). Например, в моем XML у меня есть несколько тегов, имеющих атрибут lang. Я знаю, что все они должны иметь одинаковую ценность. Я просто хочу получить любой из них.

Сейчас я делаю это: //*[1][@lang]/@lang, но, похоже, он не работает должным образом по неизвестной причине.

Мои попытки привели меня к вещам, начиная от объединения всех значений @lang ('en en en en ...') и заканчивая ничем, иногда между тем, что я хочу, но не во всем XML.


РЕДАКТИРОВАТЬ:

На самом деле //@lang[1] не может работать, потому что функция position() вызывается перед проверкой на наличие атрибута lang. Так что всегда требуется самый первый элемент, найденный в XML. Он работал лучше всего в то время, потому что много-много раз атрибут lang находился в корневом элементе.

Ответы [ 3 ]

7 голосов
/ 21 июля 2009

После еще нескольких попыток вот рабочее решение:

 (//@lang)[1]

Круглые скобки необходимы для отделения [1] от имени атрибута, в противном случае функция position() применяется в родительском элементе атрибута (что бесполезно, поскольку в теге может быть только один атрибут определенного имени). : поэтому //@lang[2] всегда ничего не выбирает).

2 голосов
/ 09 июля 2009

Вы пробовали это?

//@lang[1]

здесь вы можете увидеть пример.

1 голос
/ 09 июля 2009

Кажется, что следующий XPath делает то, что вы хотите:

//*[@lang][1]/attribute::lang
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...