Главная » XSLT » Работа с XSLT в программах на языке Perl

0

Задача

Имеется задача, для решения которой больше подходит Perl, но какие-то части проще реализовать с использованием XSLT.

Решение

Существует несколько способов воспользоваться XSLT из Perl. Модули XML::LibXSLT и XML::LibXML предоставляют интерфейс к библиотекам GNOME, реализующим процессоры SAX и XSLT. В следующем примере, заимствованном из книги Erik T. Ray и Jason McIntosh Perl and XML (O’Reilly, 2002), приведена Perl- программа для пакетной обработки нескольких XML-файлов одним и тем же XSLT-сценарием, который компилируется только один раз:

use XML::LibXSLT; use XML::LibXML;

#       аргументами являются имена таблицы стилей и входных файлов my( $style_file, @source_files ) = @ARGV;

#       иницилизировать анализатор и процессор XSLT my $parser = XML::LibXML->new( );

my $xslt = XML::LibXSLT->new( );

my $stylesheet = $xslt->parse_stylesheet_file( $style_file );

#       для каждого входного файла: разобрать, преобразовать, напечатать результат foreach my $file ( @source_files ) {

my $source_doc = $parser->parse_file( $source_file ); my $result = $stylesheet->transform( $source_doc ); print $stylesheet->output_string( $result );

}

Параметры для таблицы стилей можно передать в хэше, как показано в следу­ющем фрагменте:

#       Код, не отличающийся от предыдущего примера, опущен.

my %params = {

paraml => 10, param2 => ‘foo’,

} ;

foreach my $file ( @source_files ) {

my $source_doc = $parser->parse_file( $file );

my $result = $stylesheet->transform($source_doc, %params);

print $stylesheet->output_string( $result );

}

Возможность передавать параметры из Perl в таблицу стилей позволяет среди прочего написать на Perl CGI-сценарий, который получает входные данные из

HTML-формы и опрашивает XML-базу данных с помощью XSLT. См. рецепт 13.5, где для той же цели мы запускали процессор XSLT в отдельном процессе вместо того, чтобы встроить его.

Еще один модуль для работы с XSLT из Perl – это XML::Xalan. Его автор Эдвин Пратомо (Edwin Pratomo) считает, что он все еще находится на уровне аль­фа-версии.

Проще всего использовать XML::Xalan, если таблица стилей и данные хра­нятся во внешних файлах:

use XML::Xalan;

#       Конструируем объект Transformer

my $tr = new XML::Xalan::Transformer;

#       Компилируем таблицу стилей

my $compiled = $tr->compile_stylesheet_file("my.xsl");

#       Разбираем входной документ

my $parsed = $tr->parse_file("my.xml");

my $dest_file = "myresult.xml" ;

#       Выполняем преобразование и сохраняем результат

$tr->transform_to_file($parsed, $compiled, $dest_file)

or die $tr->errstr;

Иногда полезнее сохранить результат в переменной для последующей об­работки:

my $res = $tr->transform_to_data($parsed, $compiled);

Предварительно разбирать входной документ и компилировать таблицу сти­лей необязательно, так как и то, и другое можно передать в виде файла или строки:

my $res = $tr->transform_to_data($src_file, $xsl_file);

Результатом является строка, поэтому такое применение наиболее осмыслен­но в случае, когда на выходе получается текст, подлежащий дальнейшей обработ­ке средствами Perl.

Можно получить результаты и в виде событий:

#       Создаем обработчик

$out_handler = sub {

my ($ctx, $mesg) = @_;

print $ctx $mesg;

};

#       Вызываем преобразование, передавая обработчик

$tr->transform_to_handler( $xmlfile, $xslfile, *STDERR, $out_handler);

Обсуждение

Многие Perl-овики не включают в свой арсенал XSLT, поскольку человек, овладевший языком Perl, уже не понимает, как что-то можно делать по-друго­му. Впрочем, будем справедливы – многие программисты на Perl все же призна­ют, что на свете есть и другие языки, а XSLT безусловно может существенно упро­стить сложные преобразования XML, даже если вся остальная программа написана на Perl.

См. также

В числе других решений, объединяющих Perl и XSLT, следует упомянуть мо­дуль XML::GNOME::XSLT (автор T. J. Mather) – интерфейс к библиотеке libXSLT, представляющей собой процессор XSLT для проекта GNOME. Можно также попробовать реализацию XSLT на чистом Perl – модуль XML::XSLT (ав­тор Jonathan Stowe). В настоящее время в ней отсутствуют такие средства XSLT 1.0, как xsl:sort, xsl:key и xsl:import, а ряд других реализован лишь час­тично. Третий вариант – модуль XML::Sablotron (автор Pavel Hlavnicka), пред­ставляющий собой интерфейс в написанному на C++ процессору XSLT от компании Ginger Alliance. Информацию обо всех этих модулях можно найти на сайте http:// www.cpan.org.

Наконец, еще одна связка Perl и XSLT – комплект AxKit (http://axkit.org), XML-сервер приложений для Apache. В AxKit применяется конвейерная модель, позволяющая разбить обработку на несколько этапов. Функциональность XSLT основана на процессоре Sablotron.

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии