You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by My...@lotus.com on 2001/03/06 16:23:42 UTC

Re: Xalan2 several problems building Templates from SAX. Demo project attached

I believe I have a couple ideas on what may  be happening, but someone else
can correct me if I'm wrong or misunderstood something:

1- I'm not sure I understand what you're doing in getTemplatesSource().
You're creating a new SAXSource using a reader using the stylesheet file
and an inputSource using the xml file? Shouldn't they both point to the
stylesheet? I think thats why you're getting the mix up with the systemId.
2- In print(), you seem to be doing an identity transform which copies the
input source to output as is, including the DTD.
3-Could this be related to problem 1??

Myriam




"Roytman, Alex" <ro...@peacetech.com> on 03/05/2001 11:56:32 PM

Please respond to xalan-dev@xml.apache.org

To:   "'xalan-dev@xml.apache.org'" <xa...@xml.apache.org>
cc:    (bcc: Myriam Midy/CAM/Lotus)
Subject:  Xalan2 several problems building Templates from SAX. Demo project
       attached

I encountered several problems with Xalan 2. I apologies in advance if
these problems came from my lack of experience with Xalan 2. I just started
transitioning my web framework to Xalan2.


The problems manifest themselves in case I build stylesheet from SAXSource
which has chain of filters as an XMLReader
Here I only list these problems please see my comments in the java source


- Logical problem with SAXSource.setSystemId()
- TemplatesHandler outputs DTD
- TemplatesHandler reports SystemId Unknown and crashes


This is the source code for your convenience. Entire project including
xsl/xml files is attached:






package xalantest;


import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;


import org.xml.sax.XMLReader;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.InputSource;
import org.xml.sax.XMLFilter;


import javax.xml.transform.*;
import javax.xml.transform.sax.*;
import javax.xml.transform.stream.*;


/*
This sample suppose to generate a stylesheet by another stylesheet to an
xml file
It does not work hovewer
There are of course other ways to achieve the same functionality but I
wanted to return
a Source rather than Templates object so it can be used with all TraX API
*/


public class Xalan2test {
  private final SAXTransformerFactory transformerFactory
= (SAXTransformerFactory)SAXTransformerFactory.newInstance();
  private final SAXParserFactory parserFactory =
SAXParserFactory.newInstance();


  public Xalan2test() {
    parserFactory.setNamespaceAware(true);
  }


  public Source getTemplatesSource(String styleId, String xmlId) throws
Exception {
    XMLReader reader = parserFactory.newSAXParser().getXMLReader();
    reader.setFeature("http://apache.org/xml/features/validation/dynamic",
true);
    Templates style = transformerFactory.newTemplates(new
StreamSource(styleId));
    XMLFilter styleReader = transformerFactory.newXMLFilter(style);
    //in this simple case we could skip setting parent because it is just a
parser
    //but in other cases parent is some special filter or chain of filters
    styleReader.setParent(reader);
    InputSource xmlInputSource = new InputSource(xmlId);
    Source styleSource = new SAXSource(styleReader, xmlInputSource);
    //There is a logical problem in SAXSource I believe
    //I would expect that calling styleSource.setSystemId(styleId) on
SAXSource will set systemId
    //(we need systemId so TemplatesHandler would have proper context to
resolve all external references)
    //for the stylesheet instead it calls setSystemId(styleId) on
xmlInputSource and overrides its systemId
    //When we use chain of XMLFilters xmlInputSource gets passed through
the chain of XMLFilters and
    //gets processed by the very first one and systemId we supplied for
xmlInputSource is used by that filter
    //The TemplatesHandler (which is the last in the chain( have to deal
with source which has no systemId
    //and will not be able to resolve external references
    return styleSource;
  }


  //there is a strange problem here
  //it outputs DTD as a part of stylesheet
  public void print(Source src) throws Exception {
    Transformer trans = transformerFactory.newTransformer();
    trans.setOutputProperty("indent", "yes");
    trans.transform(src, new StreamResult(System.out));
  }


  //it does not work
  //blows with message: SystemId Unknown; Line 0; Column 0; SystemId
Unknown; Line 0; Column 0; SystemId Unknown;
  //and then prints bits of stack trace in edless loop
  public void transform(Source styleSrc, String xmlId) throws Exception {
    Templates style = transformerFactory.newTemplates(styleSrc);
    style.newTransformer().transform(new StreamSource(xmlId), new
StreamResult(System.out));
  }


  public static void main(String[] args) {
    //please set it to point to your directory
    String base = "file:/work/jbproject/xalantest/";
    Xalan2test xt = new Xalan2test();
    try {
      Source src = xt.getTemplatesSource(base + "style/hello.xsl", base +
"meta/alex.xml");
      xt.print(src);
      xt.transform(src, base + "data/data.xml");
    } catch (Exception ex) {
      ex.printStackTrace();
    }


  }
}


  (See attached file: xalantest.zip)