Я пытаюсь использовать 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 = '...'"