regulares que expresiones ejemplos consultas aprender xpath

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''])]