J'essaye d'utiliser XPath pour trouver tous les éléments qui ont un élément dans un espace de noms donné.XPath - Recherche d'éléments par l'espace de nom d'attribut
Par exemple, dans le document suivant je veux trouver le foo: bar et éléments 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>
Je sais que je peux utiliser l'expression XPath suivante pour charger tous les attributs d'un espace de noms donné
"//@*[namespace-uri()='http://foo.example.com']"
Cependant:
- Cela ne me donne pas les éléments, seulement les attributs et
- où les éléments contiennent plusieurs attributs de cet espace de noms, ce XPath renvoie un résultat par attribut plutôt que par élément
Est-il possible d'obtenir ce que je veux, ou dois-je simplement de rassembler les attributs et calculer l'ensemble unique d'éléments auxquels ils correspondent?
EDIT: Dimitre Novatchev m'a donné la réponse suivante. Je ne savais pas que vous pourriez nid prédicats à l'intérieur prédicats comme ceci:
"//*[@*[namespace-uri()='http://foo.example.com']]"
Plus précisément, cela dit: « Tout élément qui a un attribut qui a namespace-uri = « ... » »
Avez-vous oublié d'ajouter un espace de nom pour doodah? Parce que je ne vois pas comment il peut être sélectionné à travers un espace de noms. – potyl
Si les clarifications n'étaient pas claires, j'ai utilisé le mauvais espace de noms dans mon exemple original. Mon erreur. – Gareth
Merci pour ce post, ça m'a vraiment aidé. Pour résumer: - Pour obtenir des éléments avec des attributs d'un espace de noms donné: '// * [@ * [namespace-uri() = 'http: //foo.example.com']]' - Pour obtenir les attributs d'un espace de noms donné: '// @ * [namespace-uri() = 'http: //foo.example.com']' –