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 = '..."
Ответы
Ответ 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']"