I'll assume the big file was not modified and it still contains all those head tags in the same order! First you'll need to load all the heads from the small file:
use strict;
use XML::Rules;
my $reader = XML::Rules->new(
rules => {
_default => 'raw',
head => 'content array',
TEI => 'pass no content',
}
);
my $heads = $reader->parsefile( $small_file_name )->{head};
#use Data::Dumper;
#print Dumper($heads);
and then filter the big XML and replace the content of the <head> tags with the ones from the small file:
my $updater = XML::Rules->new(
style => 'filter',
rules => {
_default => 'raw',
head => sub {
my ($tag, $attr) = @_;
$attr->{_content} = shift(@$heads);
return $tag => $attr;
}
}
);
$updater->filterfile( $big_file_name, $updated_big_file_name);