Make XML serialization logic portable across browsers.
git-svn-id: https://svn.apache.org/repos/asf/tuscany/sca-cpp/trunk@1053823 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/modules/js/htdocs/xmlutil.js b/modules/js/htdocs/xmlutil.js
index 1bec45f..0edaf40 100644
--- a/modules/js/htdocs/xmlutil.js
+++ b/modules/js/htdocs/xmlutil.js
@@ -130,9 +130,6 @@
}
/**
- * Make an XML document.
- */
-/**
* Return a list of strings representing an XML document.
*/
function writeXMLDocument(doc) {
@@ -153,27 +150,49 @@
function writeList(l, node, doc) {
if (isNil(l))
return node;
+
var token = car(l);
if (isTaggedList(token, attribute)) {
node.setAttribute(attributeName(token).substring(1), '' + attributeValue(token));
+
} else if (isTaggedList(token, element)) {
+
+ function mkelem(tok, doc) {
+ function xmlns(l) {
+ if (isNil(l))
+ return null;
+ var t = car(l);
+ if (isTaggedList(t, attribute)) {
+ if (attributeName(t).substring(1) == 'xmlns')
+ return attributeValue(t);
+ }
+ return xmlns(cdr(l));
+ }
+
+ var ns = xmlns(elementChildren(tok));
+ if (ns == null || !doc.createElementNS)
+ return doc.createElement(elementName(tok).substring(1));
+ return doc.createElementNS(ns, elementName(tok).substring(1));
+ }
+
if (elementHasValue(token)) {
var v = elementValue(token);
if (isList(v)) {
var e = expandElementValues(elementName(token), v);
writeList(e, node, doc);
} else {
- var child = doc.createElement(elementName(token).substring(1));
+ var child = mkelem(token, doc);
writeList(elementChildren(token), child, doc);
node.appendChild(child);
}
} else {
- var child = doc.createElement(elementName(token).substring(1));
+ var child = mkelem(token, doc);
writeList(elementChildren(token), child, doc);
node.appendChild(child);
}
} else
node.appendChild(doc.createTextNode('' + token));
+
writeList(cdr(l), node, doc);
return node;
}