java.lang.ClassCastException: net.sf.saxon.jaxp.StreamingTransformerImpl cannot be cast to net.sf.saxon.jaxp.TransformerImpl when trying to use newXMLFilter() with StreamingTransformerFactory
Added by Martin Honnen over 7 years ago
Based on https://stackoverflow.com/questions/44969384/how-to-remove-xml-namesapce-with-sax-parser/44969723?noredirect=1#comment76932345_44969723 I tried to "implement" a SAX XMLFilter as an XSLT 3.0 stylesheet and use it in a processing chain in a pure streaming way, however, I get an exception
java.lang.ClassCastException: net.sf.saxon.jaxp.StreamingTransformerImpl cannot be cast to net.sf.saxon.jaxp.TransformerImpl at net.sf.saxon.jaxp.SaxonTransformerFactory.newXMLFilter(SaxonTransformerFactory.java:467) at net.sf.saxon.jaxp.SaxonTransformerFactory.newXMLFilter(SaxonTransformerFactory.java:449)
The Java method is
public static void main(String[] args) throws TransformerConfigurationException, TransformerException, ParserConfigurationException, SAXException {
SAXParserFactory saxFact = SAXParserFactory.newInstance();
saxFact.setNamespaceAware(true);
XMLReader reader = saxFact.newSAXParser().getXMLReader();
TransformerFactory transFact = new StreamingTransformerFactory();
XMLFilter removeNamespaces = ((SAXTransformerFactory)transFact).newXMLFilter(new StreamSource("remove-namespaces.xsl"));
removeNamespaces.setParent(reader);
Transformer transformer = transFact.newTransformer(new StreamSource("upper-case-names.xsl"));
transformer.transform(new SAXSource(removeNamespaces, new InputSource("input-namespaces1.xml")), new StreamResult(System.out));
System.out.println();
}
the exception happens on the @XMLFilter removeNamespaces = ((SAXTransformerFactory)transFact).newXMLFilter(new StreamSource("remove-namespaces.xsl"));@ line.
When I use the same code with an @EnterpriseTransformerFactory@ instead (@TransformerFactory transFact = new EnterpriseTransformerFactory();@), it works fine and does what I want it to do as far as chaining the stylesheets, only indicating with warnings "is streamable, but the input is not supplied as a stream" that there is no streaming happening.
Is there any way to use a @StreamingTransformerFactory()@ to create an XMLFilter for streamed processing?
Replies (2)
RE: java.lang.ClassCastException: net.sf.saxon.jaxp.StreamingTransformerImpl cannot be cast to net.sf.saxon.jaxp.TransformerImpl when trying to use newXMLFilter() with StreamingTransformerFactory - Added by Michael Kay over 7 years ago
I can confirm that the new StreamingTransformerFactory doesn't support generation of an XMLFilter. I'm looking into it to see whether it can be enhanced to do so.
RE: java.lang.ClassCastException: net.sf.saxon.jaxp.StreamingTransformerImpl cannot be cast to net.sf.saxon.jaxp.TransformerImpl when trying to use newXMLFilter() with StreamingTransformerFactory - Added by Michael Kay over 7 years ago
Now implemented; will be in next maintenance release.
Please register to reply