use strict;
use warnings;
use XML::Twig;
my $html_code = '
Glossary
Glossary
- E Definition
- E - data
- B Definition
- B - data
- A_definition
- A data.
- C definition
- C - data
';
my $twig = XML::Twig->new(pretty_print => 'indented');
$twig->parse($html_code);
for my $dl ($twig->root()->get_xpath('//dl'))
{
my @entries;
for my $el ($dl->children())
{
$el->cut();
if ($el->gi() eq 'dt')
{
push @entries, [ $el ];
}
else
{
push @{$entries[-1]}, $el;
}
}
@entries = sort {
$a->[0]->text() cmp $b->[0]->text()
} @entries;
for my $entry (@entries)
{
$_->paste(last_child => $dl) for @$entry;
}
print $dl->sprint(),"\n";
}