I am using the Java/TrAX XMLFilter to create a chain of XSLT transformations, I
am wanting to be able to
inject parameters into the XSLT stylesheets from the application. The
Transformer interface allows this using
setParameter(name, value). This works fine for simple XSLT transformations, but
I can't get it to work for
filter chains.
Some code:
Simple transform - parameters work fine:
...
SAXTransformerFactory stf =
(SAXTransformerFactory) TransformerFactory.newInstance();
// Set up the output stream
StreamResult result = new StreamResult(System.out);
// Set up the transformer to process the SAX events generated
// by the last filter in the chain
Transformer transformer = stf.newTransformer(stylesheetSource);
SAXSource transformSource = new SAXSource(input);
transformer.setParameter("bob", "Kate");
transformer.transform(transformSource, result);
...
Filter transform chain - parameter values are not seen in the stylesheets:
...
SAXTransformerFactory stf =
(SAXTransformerFactory) TransformerFactory.newInstance();
XMLFilter filter1 = stf.newXMLFilter(new StreamSource(stylesheet1));
XMLFilter filter2 = stf.newXMLFilter(new StreamSource(stylesheet2));
filter1.setParent(reader);
filter2.setParent(filter1);
// Set up the output stream
StreamResult result = new StreamResult(System.out);
Transformer transformer = stf.newTransformer();
SAXSource transformSource = new SAXSource(filter2, input);
transformer.setParameter("bob", "Kate");
transformer.transform(transformSource, result);
...
Example stylesheet with parameter:
<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:param name="bob"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
$bob=[<xsl:value-of select="$bob"/>]
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
The key difference seems to be this line:
Transformer transformer = stf.newTransformer()
and
Transformer transformer = stf.newTransformer(stylesheetSource);
Certainly in the Xalan stuff in JDK1.4.2 the class of the transformer object
returned in each case is
different (TransformerIdentityImpl or TransformerImpl).
All the examples I have found that use setParameter() on Transformer don't use
filter chains.
Question is: is this supposed to work or is this a bug?
If not any suggestions on how to inject parameters into the transformations of
a filter chain? Ideally I would
be able to inject different parameters for each of the transforms in the filter
chain, but simply setting
parameters that apply to all transformations would be ok.
Steve
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list