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;
 }