que - XPath-Obtener nodo sin hijo de tipo específico
que es xpath (5)
XML: /A/B
o /A
Quiero obtener todos los nodos A
que no tengan ningún B
hijos.
He intentado
/A[not(B)]
/A[not(exists(B))]
sin éxito
Prefiero una solución con la sintaxis /*[local-name()="A" and .... ]
, si es posible. ¿Alguna idea que funciona?
Aclaración. El xml se ve así:
<WhatEver>
<A>
<B></B>
</A>
</WhatEver>
o
<WhatEver>
<A></A>
</WhatEver>
El primero / hace que XPath comience en la raíz del documento, dudo que sea lo que pretendía.
Quizás quisiste decir // A [not (B)] que encontraría todos los nodos A en el documento en cualquier nivel que no tenga un hijo B directo.
O tal vez ya se encuentre en un nodo que contiene nodos A, en cuyo caso solo quiere A [no (B)] como XPath.
Pruebe esto "/A[not(.//B)]"
o este "/A[not(./B)]"
.
Si está intentando obtener A en cualquier parte de la jerarquía desde la raíz, esto funciona (para xslt 1.0 y 2.0 en caso de que se use en xslt)
//descendant-or-self::node()[local-name(.) = ''a'' and not(count(b))]
O también puedes hacer
//descendant-or-self::node()[local-name(.) = ''a'' and not(b)]
O también
//descendant-or-self::node()[local-name(.) = ''a'' and not(child::b)]
No hay formas de xslt para lograr lo mismo.
Nota: los XPaths distinguen entre mayúsculas y minúsculas, por lo tanto, si los nombres de los nodos son diferentes (que estoy seguro, nadie va a usar A, B), asegúrese de que el caso coincida.
Tal vez *[local-name() = ''A'' and not(descendant::*[local-name() = ''B''])]
?
Además, debe haber solo un elemento raíz, por lo que para /A[...]
está recuperando todo su XML o ninguno. Tal vez //A[not(B)]
or /*/A[not(B)]
?
Realmente no entiendo por qué /A[not(B)]
no funciona para usted.
~/xml% xmllint ab.xml
<?xml version="1.0"?>
<root>
<A id="1">
<B/>
</A>
<A id="2">
</A>
<A id="3">
<B/>
<B/>
</A>
<A id="4"/>
</root>
~/xml% xpath ab.xml ''/root/A[not(B)]''
Found 2 nodes:
-- NODE --
<A id="2">
</A>
-- NODE --
<A id="4" />
Utilizar esta:
/*[local-name()=''A'' and not(descendant::*[local-name()=''B''])]