XPath: ¿Cómo seleccionar nodos que no tienen atributos?

94

Usando XPath, ¿cómo seleccionar nodos que no tienen atributos (donde el atributo cuenta = 0)?

Por ejemplo:

<nodes>
    <node attribute1="aaaa"></node>
    <node attribute1="bbbb"></node>
    <node></node> <- FIND THIS
</nodes>
Zanoni
fuente

Respuestas:

153
//node[not(@*)]

Ese es el XPath para seleccionar todos los nodos llamados "nodo" en el documento sin ningún atributo.

48klocs
fuente
1
Esto es bueno, pero todavía encuentra <node class=""></node>algo que podamos hacer al respecto.
Marek
1
@MarekCzaplicki vea la respuesta a continuación para abordar este caso. stackoverflow.com/questions/1323755/…
phil
23
//node[count(@*)=0]

Seleccionará todos los <nodo> con atributos cero

erik
fuente
9

Para abordar el comentario de Marek Czaplicki y ampliar la respuesta

//node[not(@*) or not(string-length(@*))]

.... seleccionará todos los elementos de nodo con atributos cero O que tengan atributos que estén todos vacíos. Si solo le interesa un atributo en particular, en lugar de todos ellos, puede usar

//node[not(@attribute1) or not(string-length(@attribute1))]

... y esto seleccionaría todos los elementos de nodo que no tienen un atributo llamado attribute1OR que tienen unattribute1 atributo que está vacío.

Es decir, los siguientes elementos serían seleccionados por cualquiera de estas expresiones xpath

<nodes>
    <node attribute1="aaaa"></node>
    <node attribute1=""></node> <!--This one -->
    <node attribute1="bbbb"></node>
    <node></node> <!--...and this one -->
</nodes>

Vea el ejemplo de jsfiddle aquí

Phil
fuente