$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);
} else if (!is_array($obj)) { # overwrite
foreach ($node->child_nodes() as $child) {
$node->remove_child($child);
$processed = false;
if ($child->node_type() == XML_ELEMENT_NODE) {
+ unset($id);
+
$tag = $child->node_name();
$attrs = $child->attributes();
if (isset($attrs)) {
if ($attr->namespace_uri() == 'http://template.sesse.net/' && $attr->name() == 'id') {
$id = $attr->value();
if ($clean) {
- $child->remove_attribute($attr->name());
+ $attr->unlink_node();
}
}
}
}
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) {
}
$node->remove_child($child);
}
-
- return;
}
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) {
+ $nsuri = $node->namespace_uri();
+ if (isset($nsuri)) {
+ $newnode = $doc->create_element_ns($node->namespace_uri(), $node->node_name(), $node->prefix());
+ } else {
+ $newnode = $doc->create_element($node->node_name());
+ }
+
+ $attrs = $node->attributes();
+ if (isset($attrs)) {
+ foreach ($node->attributes() as $attr) {
+ $attr2 = $doc->create_attribute($attr->name(), $attr->value());
+ $nsuri = $attr->namespace_uri();
+ if (isset($nsuri)) {
+ $attr2->set_namespace($nsuri, $attr->prefix());
+ }
+ $newnode->append_child($attr2);
+ }
+ }
+ 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)
{