package Cookbook::XMLtoHTML;
use Apache::Constants qw(NOT_FOUND SERVER_ERROR OK);
use XML::LibXML;
use XML::LibXSLT;
use strict;
# We can use the same parsers between requests.
my ($parser, $xslt);
sub handler ($$) {
my ($class, $r) = @_;
my ($source, $style_doc, $stylesheet);
# Initialize the XML and XSLT parser.
$parser ||= XML::LibXML->new;
$xslt ||= XML::LibXSLT->new;
my $filename = $r->filename;
# If we receive a .html request change the extension to .xml.
$filename =~ s/\.html$/.xml/;
eval { $source = $parser->parse_file($filename) }
or return NOT_FOUND;
# Look for .xsl file for this document.
# Try document.xsl, then default.xsl in the same directory.
$filename =~ s/\.xml$/.xsl/;
$filename =~ s![^/]+$!default.xsl! unless -f $filename;
eval { $style_doc = $parser->parse_file($filename) }
or return NOT_FOUND;
eval { $stylesheet = $xslt->parse_stylesheet($style_doc) }
or return SERVER_ERROR;
my $results = $stylesheet->transform($source);
$r->send_http_header('text/html');
$r->print($stylesheet->output_string($results));
return OK;
}
1;