$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);
}
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) {
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)
{