It looks like the code below would work with XML::Twig, provided you have the complete translation table. It's a bit hard to test it when the data you provided did not include any of the translitatration in the piece of %trans</%> that's included.
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my %trans = (
"t'i" =>'ти',
"t'a" =>'тя',
"t'u" =>'тю',
"t'e" =>'те',
#It continues like this for several hundred lines, this is just a snip
+pet. So it just goes through all character combinations and turns the
+ text to cyrillic.
);
# Actual Translation Logic:
my @signs = sort {length($b) <=> length($a)} keys %trans;
@signs = map quotemeta($_), @signs;
my $re = join '|', @signs, '.';
XML::Twig->new( twig_roots =>
{ q{TIER[@LINGUISTIC_TYPE_REF='orthT' and @PARENT_REF='ref@S1' an
+d @PARTICIPANT='S1' and @TIER_ID='orth@S1']/ANNOTATION/REF_ANNOTATION
+/ANNOTATION_VALUE}
=> sub { my $in= $_->text; #warn "called text: ", $_->text,
+"\n";
$in=~ s/($re)/exists($trans{$1}) ? $trans{$1} : $1/
+geo;
$_->set_text( $in);
$_->print;
},
},
twig_print_outside_roots => 1,
)
->parsefile( 'in.xml');