My suggestion would be to extend XML::Xalan, a Perl interface to Xalan-C++. This lets you apply a (potentially dynamically generated) XSL transformation to an XML document. Example from the docs:
use XML::Xalan;
my $tr = new XML::Xalan::Transformer;
# parse an XML string:
my $parsed = $tr->parse_string(<<"XML");
<?xml version="1.0"?>
<doc>Hello</doc>
XML
# compile a stylesheet string:
my $compiled = $tr->compile_stylesheet_string(<<"XSLT");
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="doc">
<out><xsl:value-of select="."/></out>
</xsl:template>
</xsl:stylesheet>
XSLT
my $res = $tr->transform_to_data($parsed, $compiled);
If anyone needs me I'll be in the Angry Dome.