XPath: Como selecionar nós que não possuem atributos?

94

Usando XPath, como selecionar nós que não têm atributos (onde contagem de atributo = 0)?

Por exemplo:

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

Respostas:

153
//node[not(@*)]

Esse é o XPath para selecionar todos os nós denominados "nó" no documento sem quaisquer atributos.

48klocs
fonte
1
Isso é bom, mas ainda encontra <node class=""></node>algo que podemos fazer sobre isso?
Marek de
1
@MarekCzaplicki veja a resposta abaixo para resolver este caso. stackoverflow.com/questions/1323755/…
phil
23
//node[count(@*)=0]

Selecionará todos os <nó> com zero atributos

Erik
fonte
9

Para abordar o comentário de Marek Czaplicki e expandir a resposta

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

.... selecionará todos os elementos do nó com zero atributos OU que possuem atributos que estão todos vazios. Se fosse apenas um atributo específico de seu interesse, em vez de todos eles, você poderia usar

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

... e isso selecionaria todos os elementos do nó que não têm um atributo chamado attribute1OR que tem um attribute1atributo vazio.

Ou seja, os seguintes elementos seriam selecionados por qualquer uma dessas expressões xpath

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

Veja o exemplo de jsfiddle aqui

phil
fonte