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

StackOverflow https://stackoverflow.com/questions/103325

  •  01-07-2019
  •  | 
  •  

Вопрос

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

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>
Это было полезно?

Решение

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

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

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

Это позволит выполнить поиск по всем элементам "a" во всем вашем XML-документе, независимо от того, вложены ли они в элемент "blah"

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

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

Другие советы

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

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

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

//attribute::*[contains(., 'Foo')]
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, поскольку атрибут - это еще одна ось поиска.В качестве альтернативы вы можете выбрать первые 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')]

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top