my $old_parent = $root; my $new_parent; my %modules; for my $node ($old_parent->childNodes()) { next if $node->nodeName() ne 'module'; my $mod_name = $node->getAttribute('name'); if ($mod_name eq 'all') { $new_parent = $node; } else { $old_parent->removeChild($node); $modules{$name} = $node; } } my %refcount; for my $node ($new_parent->childNodes()) { next if $node->nodeName() ne 'moduleref'; my $mod_name = $node->getAttribute('name'); my $referred_node = $modules{$name} or next; $referred_node = $referred_node->cloneNode(1) if $refcount{$mod_name}++; $new_parent->replaceChild($referred_node, $node); }