From 4a06937388cda9f73e08d57e17f65806879e9e13 Mon Sep 17 00:00:00 2001 From: "sgunderson@bigfoot.com" <> Date: Sat, 12 Aug 2006 23:33:16 +0200 Subject: [PATCH] Make a workaround for PHP's broken clone_node(). --- php/xml-template.php | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/php/xml-template.php b/php/xml-template.php index d7e8aef..bbc76f2 100644 --- a/php/xml-template.php +++ b/php/xml-template.php @@ -18,7 +18,7 @@ function XML_Template_process($node, $obj, $clean = 1) $obj = $obj->document_element(); } - $newobj = $obj->clone_node(true); + $newobj = own_clone_node($obj, $node->owner_document()); $node->append_child($newobj); XML_Template_process($newobj, array(), $clean); @@ -83,7 +83,7 @@ function XML_Template_process($node, $obj, $clean = 1) } foreach ($obj as $instance) { - $newnode = $frag->clone_node(true); + $newnode = own_clone_node($frag, $frag->owner_document()); $node->append_child($newnode); XML_Template_process($newnode, $instance, $clean); if ($clean) { @@ -142,6 +142,35 @@ function XML_Template_alternate($tag, $array, $elems) return $array; } + +# 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); + } +} function is_associative_array($arr) { -- 2.39.2