I've completed my <?xml-stylesheet?> mapper. Rather than try and stuff modules into the type="..." attribute I decided it was best to just leave that as a content-type, and allow you to add mappings to you .htaccess or wherever you want them... I've also updated Apache::XPath::NotXSLT to use this module, and for some glorious reason I'm now getting 80 requests/sec. Very nice. It's all available on http://xml.sergeant.ord/download/ - I'll upload to CPAN after I hear back from people, or some other time if no interest is generated ;-) (PS: Appologies if anyone was trying to access xml.sergeant.org this afternoon - there seems to be a bug in mod_perl that I was grappling with to get this to work). Here's the README. Let me know if there are any questions. NAME Apache::XMLStylesheet - Execute module based on <?xml- stylesheet?> SYNOPSIS # in .htaccess PerlHandler +Apache::XMLStylesheet PerlSetVar StylesheetMap "text/xsl => XML::XSLT::transformfiles, \ application/x-mystyle => My::Style" PerlSetVar PreferredStyle "default style" DESCRIPTION This module automatically detects XML stylesheet types and associates modules/functions with those stylesheets according to the StylesheetMap variable. See http://www.w3.org/TR/xml- stylesheet for details on the xml-stylesheet processing instruction that this module uses. This module also checks for you whether the xml file and stylesheet files exist, so you don't need to check that in your template/stylesheet implementation if you don't want to. If an error occurs at any point it is logged in the error log, and DECLINED is returned, so that other Apache modules might have a chance to process the file. In the mapping you can either present a function (fully qualified with package), or a package. Different parameters are passed depending on whether you specify a function or a package: 'type' => Package::function The function receives the xml filename as the first parameter, and the stylesheet filename as the second parameter. The return value of the method is not considered, and Apache always returns OK. 'type' => Package The Package's handler() function is called, with the Apache::Request object as the first parameter, the xml filename as the second parameter and the stylesheet filename as the third parameter. Apache returns whatever the return value of the handler() function is. The PreferredStyle option will make use of the "alternate" attribute of the xml-stylesheet processing instruction. PerlFixupHandler If you install Apache::XMLStylesheet as a PerlFixupHandler, rather than an ordinary PerlHandler, the actual type handler gets called by pushing the handler onto the stack as a PerlHandler. The benefits of this are that it gives you better information from the Apache::Request object given as the first parameter. The downside is that it's significantly slower than installing as an ordinary PerlHandler (80 requests/sec vs 20 for a PerlFixupHandler). If anyone can tell me why its so much slower I'd love to know. Apache::MimeXML Originally this module required that Apache::MimeXML v0.03 or higher be installed, because this module sets the Apache notes table entry: is_xml => 1 However it appears that you can't operate PerlTypeHandlers _and_ PerlHandlers at the same time with mod_perl. I've logged a bug, and hopefully it will get fixed. In the meantime only files ending in .xml will be processed by this module, which isn't great. AUTHOR Matt Sergeant, [EMAIL PROTECTED] LICENSE This module is distributed under the same terms as Perl itself. -- <Matt/> Fastnet Software Ltd. High Performance Web Specialists Providing mod_perl, XML, Sybase and Oracle solutions Email for training and consultancy availability. http://sergeant.org http://xml.sergeant.org