Um den Attributtyp zu kennen, müsste der Browser die DTD oder sonst eine Grammatik lesen. Das tut er nicht, die Browser setzen in diesem Fall einen nicht-validierender XML-Parser ein, der eine eventuell angegebene DTD ignoriert.
Ja, das ist so. Deswegen sucht getElementById auch nur ein Element mit dem Attribut namens »id«, die Prüfung auf Eindeutigkeit findet ja beim validieren statt. Die Browser können gar nicht anders.
Das ändert aber nichts an der Tatsache, daß das Attribut id nicht eindeutig sein muss.
In diesem Fall ist es nicht eindeutig und das ist erst mal kein Fehler.
Wieso? CSS-Selektoren sind genauso wie XPath nur eine Sprache, die zum Auswählen von Elementen/Knoten erfunden wurde.
CSS ist dazu da das Aussehen von Dokumenten zu definieren. XML ist erst mal nur ein Datenformat und beschreibt in den seltensten Fällen ein Dokument.
XPath dagegen ist dazu gedacht einen beliebigen Teil der beschriebenen Daten in einer XML-Struktur zu selektieren.
Das man um das Aussehen zu bestimmen auch einzelne Elemente selektieren muss, und daher CSS-Selektoren auch auf XML anwenden kann ist schon richtig, ich finde es aber ungewöhnlich.
Beide sind auf XML-Dokumente anwendbar. Für die Interpretation beider hat der Browser native JavaScript-Methoden.
Aber außerhalb von Browsern wirst du keine Anwendung finden, die über CSS-Selektoren geht.
CSS-Selektoren kommen dank jQuery und querySelector(All) überall im Frontend vor, XPath höchstens bei meist serverseitigen XSL-Transformationen.
Eher anders herum, nur im Browser hat man das überhaupt zur Verfügung, an vielen anderen Stellen hat man XPath.