Первая ошибка - поиск по CPAN , а не по Google:)
Это выдает кучу результатов, но скорее подчеркивает проблему CPAN, что существует более одного решения, и не всегда ясно, какие из них работают, были заброшены, сломаны, медленны или что-то еще.
И, к сожалению, лучший ответ (или, по крайней мере, один из лучших) появляется на странице четыре результатов :( Как и другие люди предложили, XML :: LibXSLT надежен и выполняет свою работу:
use XML::LibXSLT;
use XML::LibXML;
my $parser = XML::LibXML->new();
my $xslt = XML::LibXSLT->new();
my $source = $parser->parse_file('foo.xml');
my $style_doc = $parser->parse_file('bar.xsl');
my $stylesheet = $xslt->parse_stylesheet($style_doc);
my $results = $stylesheet->transform($source);
print $stylesheet->output_string($results);
Если вы хотите вывести результаты в файл, добавьте это
#create output file
open(my $output_xml_file_name, '>', 'test.xml');
print $output_xml_file_name "$results";
Однако, если вы не хотите делать что-то необычное, есть XML :: LibXSLT :: Easy , который, по сути, просто оборачивает вышеупомянутое в один вызов метода (и выполняет кучу умных вещей сцены с использованием Moose . Проверьте источник образования!).
use XML::LibXSLT::Easy;
my $p = XML::LibXSLT::Easy->new;
my $output = $p->process( xml => "foo.xml", xsl => "foo.xsl" );