El siguiente código devuelve nulo para doc.evaluate() . Pero devuelve el elemento correcto para XPath //cat:symbol[@dog:label='banana']" . Entonces, creo que no está encontrando el espacio de nombres predeterminado.
Si ejecuto console.log(ns.lookupNamespaceURI("")); o console.log(ns.lookupNamespaceURI(null)); , devuelve http://www.w3.org/2000/svg , que es el valor xmlns del SVG. Entonces, ¿por qué el código no encuentra el elemento para "//symbol[@dog:label='banana']" ?
JavaScript
fetch('test.svg') .then(response => response.text()) .then(data=>{ const parser = new DOMParser(); const doc = parser.parseFromString(data, "text/xml"); const ns = doc.createNSResolver(doc.documentElement); const res = doc.evaluate("//symbol[@dog:label='banana']", doc.documentElement, ns, XPathResult.FIRST_ORDERED_NODE_TYPE, null); console.log(res.singleNodeValue); })prueba.svg
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:dog="http://dog.com/dog" xmlns:cat="http://cat.com/cat"> <symbol dog:label="banana"> <rect y="10" x="10" width="90" height="90" stroke-width="5" stroke="#f00" fill="#f00" fill-opacity="0.5" /> </symbol> <cat:symbol dog:label="banana"> <rect y="5" x="5" width="90" height="90" stroke-width="5" stroke="#f00" fill="#f00" fill-opacity="0.5" /> </cat:symbol> </svg>XPath 1.0, que los proveedores de navegador admiten con la función de evaluate en un nodo de Document , no tiene el concepto de un espacio de nombres de elemento predeterminado, por lo que mientras que el solucionador de espacio de nombres creado asigna el prefijo vacío '' a un URI dentro del contexto de XPath 1.0 que no tiene significado como hay un nombre de elemento sin prefijo (por ejemplo, foo ) siempre selecciona un elemento con nombre local foo en ningún espacio de nombres.