A simple solution:
<%@page contentType="text/xml" import="java.io.*,java.util.*,javax.xml.parsers.*,javax.xml.transform.*,javax.xml.transform.stream.*" pageEncoding="UTF-8"%><%! long timestamp; List cache; File transformFile; public void jspInit() { ServletConfig config = getServletConfig(); transformFile = new File(config.getServletContext().getRealPath("service.xsl")); timestamp = transformFile.lastModified(); cache = new ArrayList(); } public Transformer getTransformer() { synchronized (cache) { if (transformFile.lastModified()>timestamp) { timestamp = transformFile.lastModified(); cache.clear(); } if (cache.size()>0) { Transformer t = (Transformer)cache.remove(cache.size()-1); return t; } else { return loadTransformer(); } } } public void releaseTransformer(Transformer t,long savedTimestamp) { if (savedTimestamp==timestamp) { cache.add(t); } } public Transformer loadTransformer() { ServletConfig config = getServletConfig(); try { TransformerFactory tfactory = TransformerFactory.newInstance(); return tfactory.newTransformer(new StreamSource(transformFile)); } catch (Exception ex) { config.getServletContext().log("Cannot load stylesheet.",ex); } return null; } %><% Transformer xslt = getTransformer(); long savedTimestamp = timestamp; xslt.transform(new StreamSource(request.getInputStream()),new StreamResult(out)); releaseTransformer(xslt,savedTimestamp); %>