Подтвердить что ты не робот

XPath - поиск элементов по пространству имен атрибутов

Я пытаюсь использовать XPath для поиска всех элементов, которые имеют элемент в данном пространстве имен.

Например, в следующем документе я хочу найти элементы foo: bar и doodah

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:foo="http://foo.example.com">
  <foo:bar quux="value">Content</foo:bar>
  <widget>Content</widget>
  <doodah foo:quux="value">Content</doodah>
</root>

Я знаю, что я могу использовать следующее выражение XPath для загрузки всех атрибутов из заданного пространства имен

"//@*[namespace-uri()='http://foo.example.com']"

Однако:

  • Это не дает мне элементов, просто атрибутов и
  • где элементы содержат несколько атрибутов из этого пространства имен, этот XPath возвращает результат за атрибут, а не за элемент

Можно ли получить то, что я хочу, или просто мне нужно собрать атрибуты и вычислить уникальный набор элементов, которым они соответствуют?

РЕДАКТОР: Мне дал следующий ответ Димитрия Новачева. Я не понимал, что вы можете вложить предикаты внутри предикатов следующим образом:

"//*[@*[namespace-uri()='http://foo.example.com']]"

В частности, это говорит "Любой элемент, который имеет любой атрибут, который имеет namespace-uri = '..."

4b9b3361

Ответ 1

Использование:

  //*[namespace-uri()='yourNamespaceURI-here'
     or
      @*[namespace-uri()='yourNamespaceURI-here']
     ]

оба условия предиката описываются оператором XPath or.

Таким образом, выражение XPath выбирает любой элемент, который либо:

  • принадлежит к указанному пространству имен

или

  • имеет атрибуты, принадлежащие указанному пространству имен

Ответ 2

Не уверен, что это то, что вы имеете в виду, но, удалив только 1 char в XPath, вы получите все элементы в определенном пространстве имен:

//*[namespace-uri()='http://foo.example.com']

Ответ 3

Вы можете попробовать

//*[namespace-uri()='http://foo.example.com' or @*[namespace-uri()='http://foo.example.com']]

Он даст вам элемент foo: bar и element doodah (если вы измените tal:quux на foo:quux в ваших XML-данных):

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:foo="http://foo.example.com" xmlns:tal="xxx">
  <foo:bar quux="value">Content</foo:bar>
  <widget>Content</widget>
  <doodah foo:quux="value">Content</doodah>
</root>

- это то, что вы хотите?

РЕДАКТИРОВАТЬ: Спасибо, что заметили ошибку атрибута, теперь исправлены.

Ответ 4

Ваше выражение XPath почти идеально. Вместо того, чтобы просить атрибуты "@" запрашивать элементы "", и он должен работать:

"//*[namespace-uri()='http://foo.example.com']"