Frames | No Frames |
1: /* XsltFilter.java -- 2: Copyright (C) 2001 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: package gnu.xml.pipeline; 39: 40: import java.io.IOException; 41: 42: import javax.xml.transform.TransformerFactory; 43: import javax.xml.transform.TransformerConfigurationException; 44: import javax.xml.transform.sax.*; 45: import javax.xml.transform.stream.StreamSource; 46: 47: import org.xml.sax.SAXException; 48: import org.xml.sax.ext.LexicalHandler; 49: 50: 51: /** 52: * Packages an XSLT transform as a pipeline component. 53: * Note that all DTD events (callbacks to DeclHandler and DTDHandler 54: * interfaces) are discarded, although XSLT transforms may be set up to 55: * use the LexicalHandler to write DTDs with only an external subset. 56: * Not every XSLT engine will necessarily be usable with this filter, 57: * but current versions of 58: * <a href="http://saxon.sourceforge.net">SAXON</a> and 59: * <a href="http://xml.apache.org/xalan-j">Xalan</a> should work well. 60: * 61: * @see TransformerFactory 62: * 63: * @author David Brownell 64: */ 65: final public class XsltFilter extends EventFilter 66: { 67: /** 68: * Creates a filter that performs the specified transform. 69: * Uses the JAXP 1.1 interfaces to access the default XSLT 70: * engine configured for in the current execution context, 71: * and parses the stylesheet without custom EntityResolver 72: * or ErrorHandler support. 73: * 74: * @param stylesheet URI for the stylesheet specifying the 75: * XSLT transform 76: * @param next provides the ContentHandler and LexicalHandler 77: * to receive XSLT output. 78: * @exception SAXException if the stylesheet can't be parsed 79: * @exception IOException if there are difficulties 80: * bootstrapping the XSLT engine, such as it not supporting 81: * SAX well enough to use this way. 82: */ 83: public XsltFilter (String stylesheet, EventConsumer next) 84: throws SAXException, IOException 85: { 86: // First, get a transformer with the stylesheet preloaded 87: TransformerFactory tf = null; 88: TransformerHandler th; 89: 90: try { 91: SAXTransformerFactory stf; 92: 93: tf = TransformerFactory.newInstance (); 94: if (!tf.getFeature (SAXTransformerFactory.FEATURE) // sax inputs 95: || !tf.getFeature (SAXResult.FEATURE) // sax outputs 96: || !tf.getFeature (StreamSource.FEATURE) // stylesheet 97: ) 98: throw new IOException ("XSLT factory (" 99: + tf.getClass ().getName () 100: + ") does not support SAX"); 101: stf = (SAXTransformerFactory) tf; 102: th = stf.newTransformerHandler (new StreamSource (stylesheet)); 103: } catch (TransformerConfigurationException e) { 104: throw new IOException ("XSLT factory (" 105: + (tf == null 106: ? "none available" 107: : tf.getClass ().getName ()) 108: + ") configuration error, " 109: + e.getMessage () 110: ); 111: } 112: 113: // Hook its outputs up to the pipeline ... 114: SAXResult out = new SAXResult (); 115: 116: out.setHandler (next.getContentHandler ()); 117: try { 118: LexicalHandler lh; 119: lh = (LexicalHandler) next.getProperty (LEXICAL_HANDLER); 120: out.setLexicalHandler (lh); 121: } catch (Exception e) { 122: // ignore 123: } 124: th.setResult (out); 125: 126: // ... and make sure its inputs look like ours. 127: setContentHandler (th); 128: setProperty (LEXICAL_HANDLER, th); 129: } 130: }