Страх преодолен. Мы официально используем вызовы Perl-функций из XSLT, преобразуемого из перла.
sub register_functions {
my $xslt = shift || 'XML::LibXSLT';
my $ns = 'http://whoyougle.com';
$xslt->register_function($ns, 'uri-encode',
\&URI::Escape::uri_escape_utf8);
$xslt->register_function($ns, 'js-encode',
\&escapeJS);
$xslt->register_function($ns, 'declension',
\&Lingua::RU::Numeric::Declension::numdecl);
}
Соответственно, в нужных местах теперь достаточно написать
<a href="{w:uri-encode(@href)}">
<xsl:value-of select="text()"/>
</a>
Функция, склоняющая слова после числительных, написанная на XSLT, осталась только в архивах :-)
Теперь хочется сравнить производительность чисто-XSLT-решения, решения, когда перл готовит все данные сам, и случая, когда из XSLT мы вызываем функции на Perl.
Кстати, оказалось, что libxslt регистрирует все функции в одной куче, вплоть до того, что их возможно регистрировать не на инстансе парсера (созданном вызовом new XML::LibXSLT), а непосредственно через функцию модуля:
XML::LibXSLT->register_funcion(...);