Каков правильный XPath для выбора атрибутов, содержащих "foo"?

учитывая этот XML, какой XPath возвращает все элементы, чьи

9 ответов


//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>

этот сайт отлично подходит для тестирования такого рода вещей

http://www.xmlme.com/XpathTool.aspx

изменить: Другое дело, что, хотя XPath выше вернет правильный ответ для этого конкретного xml, если вы хотите гарантировать, что вы получите только элементы " a "в элементе" blah", вы должны, как и другие, также использовать

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

этот будет искать все элементы " a "во всем xml-документе, независимо от того, вложены в элемент" бла"

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

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


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

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

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

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

descendant-or-self::*[contains(@prop,'Foo')]

или:

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

или:

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

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

descendant-or-self::

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

* or /bla/a

тег-подстановочный знак, и /bla / A является абсолютным путем.

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

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


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

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

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

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

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


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

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


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


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


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

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

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