/* * XMLTransformer.java * Copyright (C) 2002 New Zealand Digital Library, http://www.nzdl.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.greenstone.gsdl3.util; // XML classes import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.stream.StreamSource; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.dom.DOMResult; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; // other java classes import java.io.StringReader; import java.io.StringWriter; import java.io.File; import java.util.HashMap; import java.util.Set; import java.util.Map; import java.util.Iterator; /** XMLTransformer - utility class for greenstone * * transforms xml using xslt * * @author Katherine Don * @version $Revision: 5142 $ */ public class XMLTransformer { /** The transformer factory we're using */ TransformerFactory t_factory=null; /** * The no-arguments constructor. * * Any exceptions thrown are caught internally * * @return a new transformer * @see javax.xml.transform.TransformerFactory */ public XMLTransformer() { // make sure we are using the xalan transformer System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl"); try { this.t_factory = org.apache.xalan.processor.TransformerFactoryImpl.newInstance(); } catch (Exception e) { System.err.println("XMLTransformer() exception "+e.getMessage()); } } /** * Transform an XML document using a XSLT stylesheet * * @param stylesheet a filename for an XSLT stylesheet * @param xml_in the XML to be transformed * @return the transformed XML */ public String transform(String stylesheet, String xml_in) { try { // Use the TransformerFactory to process the stylesheet Source and generate a Transformer. Transformer transformer = this.t_factory.newTransformer(new StreamSource(stylesheet)); // Use the Transformer to transform an XML Source and send the output to a Result object. StringWriter output = new StringWriter(); transformer.transform(new StreamSource(new StringReader(xml_in)), new StreamResult(output)); return output.toString(); } catch (TransformerConfigurationException e) { System.err.println("XMLTransformer: couldn't create transformer object: "+e.getMessageAndLocation()); System.err.println(e.getLocationAsString()); return ""; } catch (TransformerException e) { System.err.println("XMLTransformer: couldn't transform the source: " + e.getMessage()); return ""; } } public String transformToString(Document stylesheet, Document source) { return transformToString(stylesheet, source, null); } public String transformToString(Document stylesheet, Document source, HashMap parameters) { try { // Use the TransformerFactory to process the stylesheet Source and generate a Transformer. Transformer transformer = this.t_factory.newTransformer(new DOMSource(stylesheet)); if (parameters != null) { Set params = parameters.entrySet(); Iterator i = params.iterator(); while (i.hasNext()) { Map.Entry m = (Map.Entry)i.next(); transformer.setParameter((String)m.getKey(), m.getValue()); } } //transformer.setParameter("page_lang", source.getDocumentElement().getAttribute(GSXML.LANG_ATT)); // Use the Transformer to transform an XML Source and send the output to a Result object. StringWriter output = new StringWriter(); transformer.transform(new DOMSource(source), new StreamResult(output)); return output.toString(); } catch (TransformerConfigurationException e) { System.err.println("XMLTransformer: couldn't create transformer object: "+e.getMessageAndLocation()); System.err.println(e.getLocationAsString()); return ""; } catch (TransformerException e) { System.err.println("XMLTransformer: couldn't transform the source: " + e.getMessage()); return ""; } } public Node transform(Document stylesheet, Document source) { return transform(stylesheet, source, null); } public Node transform(Document stylesheet, Document source, HashMap parameters) { try { // Use the TransformerFactory to process the stylesheet Source and generate a Transformer. Transformer transformer = this.t_factory.newTransformer(new DOMSource(stylesheet)); if (parameters != null) { Set params = parameters.entrySet(); Iterator i = params.iterator(); while (i.hasNext()) { Map.Entry m = (Map.Entry)i.next(); transformer.setParameter((String)m.getKey(), m.getValue()); } } DOMResult result = new DOMResult(); transformer.transform(new DOMSource(source), result); return result.getNode().getFirstChild(); } catch (TransformerConfigurationException e) { System.err.println("XMLTransformer: couldn't create transformer object: "+e.getMessageAndLocation()); System.err.println(e.getLocationAsString()); return null; } catch (TransformerException e) { System.err.println("XMLTransformer: couldn't transform the source: " + e.getMessage()); return null; } } public Node transform(File stylesheet, File source) { try { Transformer transformer = this.t_factory.newTransformer(new StreamSource(stylesheet)); DOMResult result = new DOMResult(); transformer.transform(new StreamSource(source), result); return result.getNode().getFirstChild(); } catch (TransformerConfigurationException e) { System.err.println("XMLTransformer: couldn't create transformer object: "+e.getMessageAndLocation()); System.err.println(e.getLocationAsString()); return null; } catch (TransformerException e) { System.err.println("XMLTransformer: couldn't transform the source: " + e.getMessage()); return null; } } }