<{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'); } ''; }>