Какой правильный XPath для выбора атрибутов, которые содержат «foo»? - PullRequest
152 голосов
/ 19 сентября 2008

Учитывая этот XML, какой XPath возвращает все элементы, чей атрибут prop содержит Foo (первые три узла):

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>

Ответы [ 9 ]

268 голосов
/ 19 сентября 2008
//a[contains(@prop,'Foo')]

Работает, если я использую этот XML для получения результатов.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

Edit: Следует также отметить, что хотя XPath, приведенный выше, будет возвращать правильный ответ для этого конкретного XML-файла, если вы хотите гарантировать, что вы получите только элементы «a» в элементе «bla», вы, как уже упоминалось, также должны использовать

/bla/a[contains(@prop,'Foo')]

При этом будет выполнен поиск всех элементов «a» во всем документе xml, независимо от того, вложены ли они в элемент «blah»

//a[contains(@prop,'Foo')]  

Я добавил это ради тщательности и в духе stackoverflow. :)

22 голосов
/ 25 февраля 2010

Этот XPath предоставит вам все узлы, которые имеют атрибуты, содержащие 'Foo', независимо от имени узла или имени атрибута:

//attribute::*[contains(., 'Foo')]/..

Конечно, если вас больше интересует содержимое самого атрибута, а не обязательно его родительский узел, просто отбросьте /..

//attribute::*[contains(., 'Foo')]
15 голосов
/ 19 сентября 2008
descendant-or-self::*[contains(@prop,'Foo')]

Или:

/bla/a[contains(@prop,'Foo')]

Или:

/bla/a[position() <= 3]

расчлененный:

descendant-or-self::

Ось - поиск через каждый узел внизу и сам узел. Часто лучше сказать это, чем //. Я сталкивался с некоторыми реализациями, где // означает где угодно (потомок или self корневого узла). Другой использует ось по умолчанию.

* or /bla/a

Тег - это подстановочный знак, а / bla / a - абсолютный путь.

[contains(@prop,'Foo')] or [position() <= 3]

Условие в пределах []. @prop - это сокращение для attribute :: prop, так как attribute это еще одна ось поиска. В качестве альтернативы вы можете выбрать первые 3 с помощью функции position ().

5 голосов
/ 19 сентября 2008

John C - самый близкий, но XPath чувствителен к регистру, поэтому правильный XPath будет:

/bla/a[contains(@prop, 'Foo')]
4 голосов
/ 14 марта 2013

Если вам также необходимо сопоставить содержимое самой ссылки, используйте text ():

//a[contains(@href,"/some_link")][text()="Click here"]

4 голосов
/ 19 сентября 2008

Вы пробовали что-то вроде:

// a [содержит (@prop, "Foo")]

Я никогда раньше не использовал функцию contains, но подозреваю, что она должна работать как рекламируется ...

2 голосов
/ 19 сентября 2008

/ bla / a [содержит (@prop, "foo")]

1 голос
/ 19 сентября 2008

попробуйте это:

// а [содержит (@ проп, 'Foo')]

, который должен работать для любых тегов "a" в документе

1 голос
/ 19 сентября 2008

Для кода выше ... // * [содержит (@ prop, 'foo')]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...