package dk.kb.yggdrasil.xslt; import java.io.ByteArrayOutputStream; import java.io.File; import javax.xml.transform.ErrorListener; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.URIResolver; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import dk.kb.yggdrasil.exceptions.ArgumentCheck; /** * Implements an XSL transformer wrapper to make XSL transformation even simpler. */ public class XslTransformer { /** XSL transformer factory object. */ private static final TransformerFactory transformerFactory = TransformerFactory.newInstance(); /** XSL transformer implementation for a specific stylesheet. */ private Transformer transformerImpl; /** * Private constructor. */ private XslTransformer() { } /** * Get a wrapped XSL transformer instance for supplied stylesheet source. * @param source XSL source * @return XSL transformer instance * @throws TransformerConfigurationException if an exception occurs while processing */ public static XslTransformer getTransformer(Source source) throws TransformerConfigurationException { ArgumentCheck.checkNotNull(source, "source"); XslTransformer transformer = new XslTransformer(); transformer.transformerImpl = transformerFactory.newTransformer(source); return transformer; } /** * Get a wrapped XSL transformer instance for supplied stylesheet file. * @param xslFile XSL file * @return XSL transformer instance * @throws TransformerConfigurationException if an error occurs while processing */ public static XslTransformer getTransformer(File xslFile) throws TransformerConfigurationException { ArgumentCheck.checkExistsNormalFile(xslFile, "xslFile"); return getTransformer(new StreamSource(xslFile)); } /** * Get XSL transformer instance. * @return XSL transformer instance */ public Transformer getTransformerImpl() { return transformerImpl; } /** * Transform XML source using the wrapped XSL transformer of this instance and output to supplied target. * @param xmlSource source XML * @param uriResolver URI resolver or null * @param errorListener error listener or null * @param outputTarget output result target to use * @throws TransformerException if an exception occurs while transforming */ public void transform(Source xmlSource, URIResolver uriResolver, ErrorListener errorListener, Result outputTarget) throws TransformerException { ArgumentCheck.checkNotNull(xmlSource, "xmlSource"); ArgumentCheck.checkNotNull(outputTarget, "outputTarget"); transformerImpl.reset(); transformerImpl.setOutputProperty(OutputKeys.INDENT, "yes"); transformerImpl.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); transformerImpl.setURIResolver(uriResolver); transformerImpl.setErrorListener(errorListener); // Feature: Add parameters, if required. transformerImpl.transform(xmlSource, outputTarget); } /** * Transform XML source using the wrapped XSL transformer of this instance and return a byte array of the result. * @param xmlSource source XML * @param uriResolver URI resolver or null * @param errorListener error listener or null * @return byte array of the result * @throws TransformerException if an exception occurs while transforming */ public byte[] transform(Source xmlSource, URIResolver uriResolver, ErrorListener errorListener) throws TransformerException { ArgumentCheck.checkNotNull(xmlSource, "xmlSource"); ByteArrayOutputStream out = new ByteArrayOutputStream(); StreamResult result = new StreamResult(out); transform(xmlSource, uriResolver, errorListener, result); return out.toByteArray(); } }