Twoje zapytanie jest nie precyzyjne. Chodzi Ci o to by wybrać wszystkie elementy <a>, których żaden przodek nie posiada atrybutu "id". Natomiast Twoje zapytanie pyta o elementy <a>, które posiadają przodka bez atrybutu "id" (widzisz różnicę?).. wystarczy, że jeden z przodków elementu <a> nie posiada atrybutu "id" i element zostanie zwrócony.
Twoje zapytanie powinno wyglądać mniej więcej tak:
Kod
.//a[not(ancestor::*[@id])]