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);
74 XML_Template_clean($newnode);
78 # remove all the <fragment> tags
80 foreach ($node->child_nodes() as $child) {
81 if ($child->name() != 'temporary-fragment') {
84 foreach ($child->child_nodes() as $child2) {
85 $node->append_child($child2);
87 $node->remove_child($child);
94 XML_Template_clean($node);
98 function XML_Template_clean($node)
100 if ($node->node_type() == XML_ELEMENT_NODE) {
101 if ($node->namespace_uri() != 'http://template.sesse.net/') {
105 # as this is a dummy node, we want to remove it and move everything further up
106 # after we've done any required replacements
107 $doc = $node->owner_document();
108 $parent = $node->parent_node();
109 foreach ($node->child_nodes() as $child) {
110 $node->remove_child($child);
111 $node->insert_before($child, $node);
113 $parent->remove_child($node);
117 function is_associative_array($arr)
119 if (!is_array($arr)) {
122 $diff = array_diff(range(0, count($arr) - 1), array_keys($arr));
123 return (count($diff) > 0);