La respuesta breve es "No, no hay nada equivalente en el mundo de XML que le permita darle un poco de margen y crear automáticamente todos los elementos y atributos en los espacios de nombres adecuados para la ubicación donde inserta eso."
La respuesta directa más cercana es la que tiene @ Robert. Como se ha señalado en mis comentarios, incluso entonces tendrá que crear ninguna fragmentos dentro de un documento SVG que tiene los mismos espacios de nombres y prefijos como el documento en el que podrás insertar el fragmento.
su lugar, puede encontrar que es tan fácil (o más fácil) para utilizar un método de conveniencia de los métodos DOM estándar:
// Create a named SVG element on a node, with attributes and optional text
function appendTo(node,name,attrs,text){
var p,ns=appendTo.ns,svg=node,doc=node.ownerDocument;
if (!ns){ // cache namespaces by prefix once
while (svg&&svg.tagName!='svg') svg=svg.parentNode;
ns=appendTo.ns={svg:svg.namespaceURI};
for (var a=svg.attributes,i=a.length;i--;){
if (a[i].namespaceURI) ns[a[i].localName]=a[i].nodeValue;
}
}
var el = doc.createElementNS(ns.svg,name);
for (var attr in attrs){
if (!attrs.hasOwnProperty(attr)) continue;
if (!(p=attr.split(':'))[1]) el.setAttribute(attr,attrs[attr]);
else el.setAttributeNS(ns[p[0]]||null,p[1],attrs[attr]);
}
if (text) el.appendChild(doc.createTextNode(text));
return node.appendChild(el);
}
function clear(node){
while (node.lastChild) node.removeChild(node.lastChild);
}
Con esto se puede hacer cosas como:
var icons={
Apps : "/images/apps.png",
Games : "/images/games.png"
}
var wrap = document.querySelector('#container');
clear(wrap);
for (var label in icons){
if (!icons.hasOwnProperty(label)) continue;
var icon = appendTo(wrap,'g',{'class':'icon'});
appendTo(icon,'image',{'xlink:href':icons[label]});
appendTo(icon,'text',{x:10,y:20},label);
}
esta es mi humilde opinión más limpio que tratar de construir el marcado SVG cruda usando concatenación de cadenas:
var svg = [];
for (var label in icons){
if (!icons.hasOwnProperty(label)) continue;
svg.push('<g class="icon">');
svg.push('<image xlink:href="'+icons[label]+'" />');
svg.push('<text x="10" y="20">'+label+'</text>');
svg.push('</g>');
}
wrap.innerSVG = svg.join(''); // doesn't work, of course
Esto requiere que el fragmento sea un documento XML válido (solo raíz única), ¿verdad? Y para los fragmentos no emparentados por un elemento SVG con el espacio de nombre adecuado, ¿los elementos creados tienen un espacio de nombre correcto? – Phrogz
Es posible que desee/necesite concluir esto como una función que envuelve la cadena en una raíz SVG con todos los espacios de nombres comunes y los prefijos predefinidos, y luego extraiga el contenido. – Phrogz
Sí, el fragmento necesitaría un atributo de espacio de nombres. –