package aQute.libg.xslt;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URL;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class Transform {
static TransformerFactory transformerFactory = TransformerFactory.newInstance();
static Map<URI,Templates> cache = new ConcurrentHashMap<URI,Templates>();
public static void transform(TransformerFactory transformerFactory, URL xslt, InputStream in, OutputStream out)
throws Exception {
if (xslt == null)
throw new IllegalArgumentException("No source template specified");
Templates templates = cache.get(xslt.toURI());
if (templates == null) {
try (InputStream xsltIn = xslt.openStream()) {
templates = transformerFactory.newTemplates(new StreamSource(xsltIn));
cache.put(xslt.toURI(), templates);
}
}
Result xmlResult = new StreamResult(out);
Source xmlSource = new StreamSource(in);
Transformer t = templates.newTransformer();
t.transform(xmlSource, xmlResult);
out.flush();
}
public static void transform(URL xslt, InputStream in, OutputStream out) throws Exception {
transform(transformerFactory, xslt, in, out);
}
}