/* * Copyright 2005 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.wamblee.xml; import org.w3c.dom.Document; import org.wamblee.io.FileResource; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; 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.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; /** * XSL transformer for simplified usage of XSL transformations. * * @author Erik Brakkee */ public class XslTransformer { private TransformerFactory factory; /** * Constructs the URL resolver. * * @param aResolver * URI resolver to use. */ public XslTransformer(URIResolver aResolver) { factory = TransformerFactory.newInstance(); factory.setURIResolver(aResolver); } /** * Constructs the XSLT processor. * */ public XslTransformer() { factory = TransformerFactory.newInstance(); } /** * Resolves an XSLT based on URI. * * @param aXslt * XSLT to resolve, * * @return Source for the XSLT * * @throws TransformerException * In case the XSLT cannot be found. */ public Source resolve(String aXslt) throws TransformerException { URIResolver resolver = factory.getURIResolver(); if (resolver == null) { if (new File(aXslt).canRead()) { try { return new StreamSource(new FileResource(new File(aXslt)) .getInputStream()); } catch (IOException e) { throw new TransformerException(e.getMessage(), e); } } else { throw new TransformerException("Cannot read '" + aXslt + "'"); } } return resolver.resolve(aXslt, ""); } /** * Transforms a DOM document into another DOM document using a given XSLT * transformation. * * @param aDocument * Document to transform. * @param aXslt * XSLT to use. * * @return Transformed document. * * @throws IOException * In case of problems reading resources. * @throws TransformerException * In case transformation fails. */ public Document transform(Document aDocument, Source aXslt) throws IOException, TransformerException { Source source = new DOMSource(aDocument); DOMResult result = new DOMResult(); transform(source, result, aXslt); return (Document) result.getNode(); } /** * Transforms a document using XSLT. * * @param aDocument * Document to transform. * @param aXslt * XSLT to use. * * @return Transformed document. * * @throws IOException * In case of problems reading resources. * @throws TransformerException * In case transformation fails. */ public Document transform(byte[] aDocument, Source aXslt) throws IOException, TransformerException { Source source = new StreamSource(new ByteArrayInputStream(aDocument)); DOMResult result = new DOMResult(); transform(source, result, aXslt); return (Document) result.getNode(); } /** * Transforms a document to a text output. This supports XSLT * transformations that result in text documents. * * @param aDocument * Document to transform. * @param aXslt * XSL transformation. * * @return Transformed document. * */ public String textTransform(byte[] aDocument, Source aXslt) throws IOException, TransformerException { Source source = new StreamSource(new ByteArrayInputStream(aDocument)); ByteArrayOutputStream os = new ByteArrayOutputStream(); StreamResult result = new StreamResult(os); transform(source, result, aXslt); return new String(os.toByteArray()); } /** * Transforms a document using XSLT. * * @param aSource * Document to transform. * @param aResult * Result of the transformation. * @param aXslt * XSLT to use. * * @throws IOException * In case of problems reading resources. * @throws TransformerException * In case transformation fails. */ public void transform(Source aSource, Result aResult, Source aXslt) throws IOException, TransformerException { try { Transformer transformer = factory.newTransformer(aXslt); transformer.transform(aSource, aResult); } catch (TransformerConfigurationException e) { throw new TransformerException( "Configuration problem of XSLT transformation", e); } } }