+
+# Ideally, this would be "return $obj->clone_node(true)". But surprise, surprise,
+# PHP is buggy (at least PHP4); it removes the prefix information from all attributes
+# during a clone. IOW, we'll have to clone evverything ourselves.
+function own_clone_node($node, $doc)
+{
+ // we only need these two
+ if ($node->node_type() == XML_ELEMENT_NODE) {
+ $newnode = $doc->create_element_ns($node->namespace_uri(), $node->node_name(), $node->prefix());
+ $attrs = $node->attributes();
+ if (isset($attrs)) {
+ foreach ($node->attributes() as $attr) {
+ // set_attribute_node() does not exist...
+ $prefix = $attr->prefix();
+ if (isset($prefix)) {
+ $newnode->set_attribute($prefix . ":" . $attr->name(), $attr->value());
+ } else {
+ $newnode->set_attribute($attr->name(), $attr->value());
+ }
+ }
+ }
+ foreach ($node->child_nodes() as $child) {
+ $newnode->append_child(own_clone_node($child, $doc));
+ }
+ return $newnode;
+ } else {
+ return $node->clone_node(true);
+ }
+}