3 function XML_Template_process_file($filename, $obj, $clean = 1)
5 $doc = domxml_open_file($filename);
6 XML_Template_process($doc, $obj, $clean);
10 function XML_Template_process($node, $obj, $clean = 1)
12 if (!is_array($obj)) { # overwrite
13 foreach ($node->child_nodes() as $child) {
14 $node->remove_child($child);
16 $doc = $node->owner_document();
17 $node->add_child($doc->create_text_node($obj));
18 # handle overwrite with a DOM object here
19 } else if (is_associative_array($obj)) { # substitute
20 foreach ($node->child_nodes() as $child) {
23 if ($child->node_type() == XML_ELEMENT_NODE) {
24 $tag = $child->node_name();
25 $attrs = $child->attributes();
27 foreach ($child->attributes() as $attr) {
28 if ($attr->namespace_uri() == 'http://template.sesse.net/' && $attr->name() == 'id') {
31 $child->remove_attribute($attr->name());
37 # check all substitutions to see if we found anything
39 foreach (array_keys($obj) as $key) {
40 # FIXME: we would want something like \Q and \E here...
41 if (preg_match('/^' . $tag . '\.(.*)$/', $key, $matches) ||
42 ($id != null && preg_match('/^#' . $id . '\.(.*)$/', $key, $matches))) {
43 $child->set_attribute($matches[0], $obj[$key]);
49 if ($key == $tag || ($id != null && $key == ('#'.$id))) {
50 XML_Template_process($child, $obj[$key], $clean);
57 XML_Template_process($child, $obj, $clean);
61 $doc = $node->owner_document();
62 $frag = $doc->create_element("temporary-fragment"); # ugh
64 foreach ($node->child_nodes() as $child) {
65 $frag->append_child($child);
66 $node->remove_child($child);
69 foreach ($obj as $instance) {
70 $newnode = $frag->clone_node(true);
71 $node->append_child($newnode);
72 XML_Template_process($newnode, $instance, $clean);
77 # remove all the <fragment> tags
79 foreach ($node->child_nodes() as $child) {
80 if ($child->name() != 'temporary-fragment') {
83 foreach ($child->child_nodes() as $child2) {
84 $node->append_child($child2);
86 $node->remove_child($child);
95 function is_associative_array($arr)
97 if (!is_array($arr)) {
100 $diff = array_diff(range(0, count($arr) - 1), array_keys($arr));
101 return (count($diff) > 0);