#!/usr/bin/perl use strict; use warnings; use XML::Twig; my (@sortedM, @sortedL); my $i=0; my $twig= new XML::Twig(twig_handlers => { 'enhancement' => sub {$_->first_child->sort_children_on_att("type");}, 'descriptor' => \&sortSubEltsHandler, }, pretty_print => 'indented', keep_atts_order => 1, ); $twig->parse(\*DATA); $twig->print; $twig->purge; sub sortSubEltsHandler { my( $t,$elt)= @_; my $root= $t->root; my @mainterms = $root->descendants(q{mainterm}); @sortedM = reverse sort { $a->text cmp $b->text } @mainterms; my @links = $root->descendants(q{link}); @sortedL =reverse sort { $a->text cmp $b->text } @links; $elt->cut_children; foreach my $mainterm (@sortedM) { my $new_elt= XML::Twig::Elt->new($mainterm->name => $mainterm->text); $new_elt->paste($elt); } foreach my $link (@sortedL) { my $new_elt= XML::Twig::Elt->new($link->name => $link->text); $new_elt->paste($elt); } }#end of sortSubEltsHandler __DATA__ plague disease pestilence f C M panadol zorro xenon aspirin b P z