Der Titel dieser Frage ist:
XPath-Ausdruck für die Auswahl aller Knoten mit einem gemeinsamen Attribute
aber nirgends wird der Text der Frage diskutieren, wie tho alle Knoten finden die ein gemeinsames Attribut haben - daher könnte der Titel falsch sein.
Um alle Knoten zu finden, die ein gemeinsames Attribut mit dem Namen haben x
(BTW, nur Element-Knoten können Attribute haben), Verwendung:
//*[@x]
Verwendung:
//@x
, um alle Attribute mit dem Namen x
im XML-Dokument auszuwählen. Dies ist wahrscheinlich der kürzeste Ausdruck dafür.
Es ist nichts falsch mit:
//*/@x
außer dass es etwas länger ist.
Es ist eine Abkürzung für:
/descendant-or-self::node()/child::*/attribute::x
und wählt auch alle x
Attribute im XML-Dokument.
Jemand könnte denken, dass dieser Ausdruck nicht das x
Attribut des obersten Elements im Dokument auswählt. Dies ist eine falsche Schlussfolgerung, weil der erste Lokalisierungsschritt:
/descendant-or-self::node()
wählt jeden Knoten in dem Dokument, einschließlich der Wurzel (/
) selbst ist. Diese
bedeutet:
/descendant-or-self::node()/child::*
jedes Element auswählt, einschließlich des oberen Elements (das das einzige Kind des Wurzelknotens in einem wohlgeformten XML-Dokument).
Also, wenn der letzte Ort Schritt /@x
schließlich hinzugefügt wird, das bisher durch die ersten beiden Schritte Standort ausgewählt alle x
Attribute aller Knoten wählen wird - das heißt alle x
Attribute aller Element-Knoten in der XML Dokument.
Gute Frage, +1.Sehen Sie meine Antwort für eine kleine Korrektur von @ Alejandros Aussage, dass Ihr XPath-Ausdruck "falsch" ist. @ Alejandros Antwort ist eine gute, mit der Ausnahme, dass an diesem XPath-Ausdruck nichts falsch ist. –