I did some investigation into this matter and the problem is in
org.apache.cocoon.sax.component.XSLTTransformer

It has two constructor methods:

    public XSLTTransformer(final URL source) {
        this(source, null);
    }

And

    public XSLTTransformer(final URL source, final Map<String, Object> 
attributes) {
        super();
        this.loadXSLT(source, attributes);
    }

So we can set attributes for the transformerfactory but not choose the 
implementation. First of all I see something in the code that makes no sense to 
me:

    /**
     * A generic transformer factory to parse XSLTs.
     */
    private static final SAXTransformerFactory TRAX_FACTORY = 
createNewSAXTransformerFactory();

this always falls back to  

    private static SAXTransformerFactory createNewSAXTransformerFactory() {
        return (SAXTransformerFactory) TransformerFactory.newInstance();
    }


But on lines 148 to 157 I see following code.  If the attributes are not null 
and not empty we STILL use createNewSAXTransformerFactory.  So the else block 
seems like a complete waste here?!


            // XSLT has to be parsed
            SAXTransformerFactory transformerFactory;
            if (attributes != null && !attributes.isEmpty()) {
                transformerFactory = createNewSAXTransformerFactory();
                for (Entry<String, Object> attribute : attributes.entrySet()) {
                    transformerFactory.setAttribute(attribute.getKey(), 
attribute.getValue());
                }
            } else {
                transformerFactory = TRAX_FACTORY;
            }

Ideally I would like to see a third constructor method which would allow us to 
set  the factoryClassName of the 
Javax.xml.transform.TransformerFactory

And default use:

public static TransformerFactory newInstance(String factoryClassName, 
ClassLoader classLoader)  throws TransformerFactoryConfigurationError

We could from Cocoon side default set this to be 
"com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl" if the 
factoryClassName is null or empty.

Just thinking out loud here... 

Robby


-----Original Message-----
From: Robby Pelssers [mailto:[email protected]] 
Sent: Tuesday, December 04, 2012 2:21 PM
To: [email protected]; [email protected]
Subject: using both Xalan and Saxon with C3

Hi guys,

Just wondering how I would configure a C3 project so I could use both Xalan and 
Saxon from my sitemap and java

I currently took the approach to just create a file 
META-INF/services/javax.xml.transform.TransformerFactory
With following content:
net.sf.saxon.TransformerFactoryImpl

But I guess that restricts me to always use Saxon by default?

Robby

Reply via email to