use strict; use warnings; use XML::Twig; my $xml = < This should be ignored.
address1 1 2 4
address1 1 2 3
XML my $twig = XML::Twig->new ( twig_roots => { 'address' => \&sortAddress, }, twig_print_outside_roots => 1, pretty_print => 'indented', ); $twig->parse ($xml); sub sortAddress { my ($t, $address)= @_; my @children = $address->cut_children (); my @untouchables = grep {$_->tag () ne 'ref'} @children; my @sorted = sort {$a->att ('refid') cmp $b->att ('refid')} grep {$_->tag () eq 'ref'} @children; $_->paste (last_child => $address) for @untouchables; $_->paste (last_child => $address) for @sorted; $address->print (); } #### This should be ignored.
address1 1 2 4
address1 1 2 3