{perl
use XML::Sablotron;
$self->define_empty_preformat_tag ("xsl",
\&HTML::WebMake::PerlLib::XSLTag::handle_xsl_tag,
qw(xmlname xslname));
# TODO: define another tag for embedded XSL? e.g.
#
# ...xsl data...
#
# hmm. see if it turns out to be handy. (I would imagine
# keeping XSLs out of content would be cleaner.)
package HTML::WebMake::PerlLib::XSLTag;
sub handle_xsl_tag {
my ($tagname, $attrs, $text, $self) = @_;
my $template = $attrs->{xsl};
my $data = $attrs->{xml};
$template = HTML::WebMake::PerlLib::XSLTag::get_content_xml
($self, $attrs->{xslname});
$data = HTML::WebMake::PerlLib::XSLTag::get_content_xml
($self, $attrs->{xmlname});
if (!defined $template || !defined $data) {
warn " tag requires valid 'xmlname' and 'xslname' attributes.\n";
return '';
}
my $sab = XML::Sablotron->new();
my $situa = XML::Sablotron::Situation->new();
$sab->addArg ($situa, "xsl", $template);
$sab->addArg ($situa, "xml", $data);
foreach my $attr (%{$attrs}) {
next if (!defined $attr || !defined $attrs->{$attr});
next if ($attr =~ /^(?:xslname|xmlname|xsl|xml)$/i);
$sab->addParam ($situa, $attr, $attrs->{$attr});
}
$sab->process ($situa, "arg:/xsl", "arg:/xml", "arg:/out");
my $ret = $sab->getResultArg ("out");
if (!defined $ret) {
warn ": an error occurred processing ".
"\"$attrs->{xmlname}\" with \"$attrs->{xslname}\"\n";
return '';
} else {
return $ret;
}
}
sub get_content_xml {
my ($self, $name) = @_;
return undef unless (defined $name);
my $main = $self->get_webmake_main_object();
my $obj = $self->get_content_object ($name);
if (!defined $obj) {
warn " tag: no such template item: \$\{$name\}\n";
return undef;
}
$main->add_content_dependency ($obj);
return $obj->get_text_as('text/xml');
}
'';
}>