hi,
I've made a small modification to the UseXMLFilters example that ships with
Xalan to try and reuse the XMLFilter on more than one xml source. I have a
system that receives multiple xml inputs and needs to transform them with
the same set of 3 stylesheets. The xmlfilter creation step accounts for 3/4
of my processing time so I'd like to not have to recreate it for every
request (there are thousands!)
Here's the code...
public class UseXMLFilters
{
public static void main(String[] args)
throws TransformerException, TransformerConfigurationException,
SAXException, IOException
{
TransformerFactory tFactory = TransformerFactory.newInstance();
if (tFactory.getFeature(SAXSource.FEATURE) &&
tFactory.getFeature(SAXResult.FEATURE))
{
SAXTransformerFactory saxTFactory = ((SAXTransformerFactory)
tFactory);
StreamSource foo1 = new StreamSource("foo1.xsl");
StreamSource foo2 = new StreamSource("foo2.xsl");
StreamSource foo3 = new StreamSource("foo3.xsl");
Templates t1 = saxTFactory.newTemplates(foo1);
Templates t2 = saxTFactory.newTemplates(foo2);
Templates t3 = saxTFactory.newTemplates(foo3);
XMLFilter xmlFilter1 = saxTFactory.newXMLFilter(t1);
XMLFilter xmlFilter2 = saxTFactory.newXMLFilter(t2);
XMLFilter xmlFilter3 = saxTFactory.newXMLFilter(t3);
XMLReader reader = XMLReaderFactory.createXMLReader();
// Create an XMLReader.
// xmlFilter1 uses the XMLReader as its reader.
xmlFilter1.setParent(reader);
// xmlFilter2 uses xmlFilter1 as its reader.
xmlFilter2.setParent(xmlFilter1);
// xmlFilter3 uses xmlFilter2 as its reader.
xmlFilter3.setParent(xmlFilter2);
// xmlFilter3 outputs SAX events to the serializer.
Serializer serializer = SerializerFactory.getSerializer
(OutputProperties.getDefaultMethodProperties("xml"));
serializer.setOutputStream(System.out);
xmlFilter3.setContentHandler(serializer.asContentHandler());
for (int i = 1; i <= 2; i++){
System.out.println("Trial " + i);
reader.parse(new InputSource("foo" + i + ".xml"));
}
}
}
}
On the second iteration, I get a nullpointerexception from the
Parser2.parseInternal method. I've tried several ways of getting the same
result but no luck. I have a sneaky suspicion that some streams are being
closed the first time through. If I just create a transformer from one
stylesheet and reuse that, it works ok. as soon as I use filter chains, it
dies. Can anyone shed some light?
Greatly appreciated,
Simon