xsl-list
[Top] [All Lists]

XSLT parameters in TrAX filter chains?

2004-03-11 03:52:01
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



<Prev in Thread] Current Thread [Next in Thread>