XPath: Jak wybrać węzły, które nie mają atrybutów?

96

Jak za pomocą XPath wybrać węzły, które nie mają atrybutów (gdzie liczba atrybutów = 0)?

Na przykład:

<nodes>
    <node attribute1="aaaa"></node>
    <node attribute1="bbbb"></node>
    <node></node> <- FIND THIS
</nodes>
Zanoni
źródło

Odpowiedzi:

155
//node[not(@*)]

To jest XPath do wybierania wszystkich węzłów o nazwie „węzeł” w dokumencie bez żadnych atrybutów.

48klocs
źródło
1
To miłe, ale nadal znajduje <node class=""></node>coś, co możemy z tym zrobić?
Marek
1
@MarekCzaplicki zobacz odpowiedź poniżej, aby rozwiązać ten przypadek. stackoverflow.com/questions/1323755/…
phil
23
//node[count(@*)=0]

Wybierze wszystkie <węzły> z zerowymi atrybutami

erik
źródło
9

Aby odnieść się do komentarza Marka Czaplickiego i rozszerzyć odpowiedź

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

.... wybierze wszystkie elementy węzłów z zerowymi atrybutami LUB z atrybutami, które są wszystkie puste. Gdyby był to tylko konkretny atrybut, który Cię interesuje, a nie wszystkie, możesz użyć

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

... a to spowoduje wybranie wszystkich elementów węzłów, które albo nie mają atrybutu o nazwie attribute1OR, które mają attribute1atrybut, który jest pusty.

Oznacza to, że następujące elementy zostałyby wybrane przez którekolwiek z tych wyrażeń xpath

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

Zobacz przykład jsfiddle tutaj

phil
źródło