Signatur
Beschreibung
Die schreibgeschützte Eigenschaft booleanValue des XPathResult-Interfaces liefert das Ergebnis eines XPath-Ausdrucks als true oder false. Voraussetzung: Das Ergebnis hat den Typ XPathResult.BOOLEAN_TYPE (Wert 3).
Das ist praktisch, wenn man nur eine Ja/Nein-Frage an ein Dokument stellen will, etwa „Gibt es ein Element mit diesem Attribut?“ oder „Ist die Anzahl der Einträge größer als 10?“. Ausdrücke wie count(//li) > 10, boolean(//form[@id="login"]) oder not(//img[not(@alt)]) liefern direkt einen Wahrheitswert. Die Knoten muss man dafür nicht selbst durchlaufen.
Am sichersten fordert man den Typ beim Aufruf von document.evaluate() ausdrücklich mit XPathResult.BOOLEAN_TYPE an. Dann wandelt die XPath-Engine das Ergebnis selbst in einen Wahrheitswert um, wie mit der XPath-Funktion boolean(): Eine nicht leere Knotenmenge wird true, eine Zahl ungleich 0 und nicht NaN wird true, eine nicht leere Zeichenkette wird true.
Rückgabewert
BOOLEAN_TYPE, wird beim Lesen ein TypeError geworfen (in älteren Spezifikationen eine XPathException vom Typ TYPE_ERR).Beispiele
Prüfen, ob ein Element existiert
// Gibt es ein Formular mit der ID "login"?
const result = document.evaluate(
'boolean(//form[@id="login"])',
document,
null,
XPathResult.BOOLEAN_TYPE,
null
);
console.log(result.resultType === XPathResult.BOOLEAN_TYPE);
console.log(result.booleanValue);
Barrierefreiheit prüfen: Haben alle Bilder ein alt-Attribut?
const hasAllAlts = (root = document) =>
document.evaluate(
'not(.//img[not(@alt)])',
root,
null,
XPathResult.BOOLEAN_TYPE,
null
).booleanValue;
if (!hasAllAlts()) {
console.warn('Mindestens ein Bild hat kein alt-Attribut.');
} else {
console.log('Alle Bilder haben ein alt-Attribut.');
}
Knotenanzahl in einem XML-Dokument vergleichen
const xml = `<warenkorb>
<artikel preis="19.90"/>
<artikel preis="5.00"/>
<artikel preis="42.00"/>
</warenkorb>`;
const doc = new DOMParser().parseFromString(xml, 'application/xml');
// Liegt der Gesamtwert über 50?
const ueber50 = doc.evaluate(
'sum(/warenkorb/artikel/@preis) > 50',
doc,
null,
XPathResult.BOOLEAN_TYPE,
null
).booleanValue;
console.log(`Versandkostenfrei: ${ueber50}`);
Fehler bei falschem Ergebnistyp abfangen
const res = document.evaluate(
'//p',
document,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
);
try {
console.log(res.booleanValue);
} catch (err) {
console.log(err.name); // Typ passt nicht
}
// Wichtig · Fallstricke
- Typprüfung: Wenn
resultTypenichtBOOLEAN_TYPEist, wirft das Lesen vonbooleanValueeinen Fehler. Das gilt auch beiANY_TYPE, wenn die Engine einen anderen Typ gewählt hat. Deshalb am besten immerXPathResult.BOOLEAN_TYPEausdrücklich anfordern oder vorherresult.resultType === XPathResult.BOOLEAN_TYPEprüfen. - Umwandlung: Mit
BOOLEAN_TYPEwird jede Knotenmenge in einen Wahrheitswert umgewandelt.//divliefert alsotrue, sobald mindestens eindivexistiert. Die Zeichenkette\"false\"ergibt ebenfallstrue, weil sie nicht leer ist. - Namensräume: Bei XML- und XHTML-Dokumenten mit Namensräumen braucht
evaluate()einen passendennamespaceResolver. Sonst findet der Ausdruck nichts, und das Ergebnis ist fälschlichfalse. - Kompatibilität: Wird von allen modernen Browsern unterstützt. In Node.js fehlt es ohne DOM-Implementierung (z. B. jsdom). Der Internet Explorer kannte
document.evaluatenicht. - Leistung: Für einfache Existenzprüfungen im HTML-DOM sind
querySelector()und ein Vergleich mitnullmeist schneller und besser lesbar.