Я пытаюсь использовать XPath для поиска всех элементов, которые имеют элемент в заданном пространстве имен.XPath - Найти элементы по пространству имен атрибутов
Например, в следующем документе я хочу найти Foo: бар и штуковина элементы
<?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 будет возвращать результат в-атрибут, а не за элемент
Можно ли получить то, что я хочу, или я просто должен собрать атрибуты и вычислить уникальный набор элементов, которым они соответствуют?
EDIT: Мне дал следующий ответ Димитрия Новачева. Я не понимаю, что вы можете вложить предикаты внутри предикаты как это:
"//*[@*[namespace-uri()='http://foo.example.com']]"
В частности, это говорит «Любой элемент, который имеет какой-либо атрибут, который имеет пространство имен URI =„...“»
Вы забыли добавить пространство имен для doodah? Потому что я не вижу, как это можно выбрать через пространство имен. – potyl
Если пояснения не были ясны, я использовал неправильное пространство имен в моем исходном примере. Виноват. – Gareth
Спасибо за этот пост, это действительно помогло. Подводя итог: - Для того, чтобы получить элементы с атрибутами из заданного пространства имен: '// * [@ * [имен-URI() = 'HTTP: //foo.example.com']]' - Получить атрибуты из заданного пространства имен: '// @ * [namespace-uri() = 'http: //foo.example.com']' –