XPath – Récupère un noeud sans enfant de type spécifique

XML: /A/B ou /A

Je veux obtenir tous les nœuds A qui n’ont pas d’enfants B

J’ai essayé

 /A[not(B)] /A[not(exists(B))] 

sans succès

Je préfère une solution avec la syntaxe /*[local-name()="A" and .... ] , si possible. Des idées qui fonctionnent?

Clarification. Le xml ressemble à:

      

ou

    

Peut-être que *[local-name() = 'A' and not(descendant::*[local-name() = 'B'])] ?

De même, il ne devrait y avoir qu’un seul élément racine, donc pour /A[...] vous récupérez tout votre XML ou aucun. Peut-être //A[not(B)] ou /*/A[not(B)] ?

Je ne comprends pas vraiment pourquoi /A[not(B)] ne fonctionne pas pour vous.

 ~/xml% xmllint ab.xml              ~/xml% xpath ab.xml '/root/A[not(B)]' Found 2 nodes: -- NODE --   -- NODE --  

Essayez ceci "/A[not(.//B)]" ou ceci "/A[not(./B)]" .

Le premier / fait que XPath démarre à la racine du document, je doute que ce soit ce que vous vouliez.

Peut-être que vous vouliez dire // A [not (B)] qui trouverait tous les nœuds A dans le document à n’importe quel niveau sans enfant B direct.

Ou peut-être vous êtes déjà à un nœud qui contient des nœuds A, auquel cas vous voulez simplement A [not (B)] comme XPath.

Si vous essayez d’obtenir un A n’importe où dans la hiérarchie à partir de la racine, cela fonctionne (pour xslt 1.0 et 2.0 dans le cas où il est utilisé dans xslt)

 //descendant-or-self::node()[local-name(.) = 'a' and not(count(b))] 

OU vous pouvez aussi faire

 //descendant-or-self::node()[local-name(.) = 'a' and not(b)] 

OU aussi

 //descendant-or-self::node()[local-name(.) = 'a' and not(child::b)] 

Il n’y a pas moyen de xslt pour réaliser la même chose.

Note: Les XPaths sont sensibles à la casse, donc si les noms de vos nœuds sont différents (ce qui est certain, personne ne va utiliser A, B), veuillez vous assurer que la casse correspond.

Utilisez ceci:

 /*[local-name()='A' and not(descendant::*[local-name()='B'])]