| ============================================================ |
| CONTENTS OF THIS DOCUMENT: |
| |
| o) HOW TO PROVIDE XSL TRANSFORMATIONS AS A WEB SERVICE |
| o) HOW TO INVOKE TRANSLETS FROM A SERVLET |
| o) BUILDING YOUR OWN DOM CACHE |
| |
| ------------------------------------------------------------ |
| HOW TO PROVIDE XSL TRANSFORMATIONS AS A WEB SERVICE |
| |
| With XSLTC, XSL transformations can be run from within a |
| servlet. The XSLTC preview package contains an example demonstrating |
| how this can be done. |
| |
| ------------------------------------------------------------ |
| HOW TO INVOKE TRANSLETS FROM A SERVLET |
| |
| The XSLTC preview package contains the example source code: |
| |
| TransformServlet.java |
| |
| This file contains a minimal implementation of an XSL |
| transformation servlet. The servlet performs the same basic |
| steps as the class implementing the XSLT command-line tool: |
| |
| // Obtain a reference to the translet class |
| Class cls = Class.forName(transletName); |
| // Instanciate a translet object (inherits AbstractTranslet) |
| AbstractTranslet translet = (AbstractTranslet)cls.newInstance(); |
| |
| // Prepare the internal DOM tree |
| final DOMImpl dom = new DOMImpl(); |
| dom.setDocumentURI(inputURI); |
| |
| // Create a parser for the input document |
| final Parser parser = new Parser(); |
| parser.setDocumentHandler(dom.getBuilder()); |
| |
| // Create a DTDMonitor for handling ID references in the DTD |
| DTDMonitor dtdMonitor = new DTDMonitor(); |
| parser.setDTDHandler(dtdMonitor); |
| |
| // Create output handler (you can plug in your own) |
| DefaultSAXOutputHandler saxHandler; |
| saxHandler = new DefaultSAXOutputHandler(out); |
| |
| // Parse the document and build the internal DOM |
| parser.parse(inputURI); |
| |
| // Pass information on id/key indicies to the translet |
| translet.setIndexSize(dom.getSize()); |
| dtdMonitor.buildIdIndex(dom, 0, translet); |
| translet.setUnparsedEntityURIs(dtdMonitor.getUnparsedEntityURIs()); |
| |
| // Start the transformation |
| translet.transform(dom, new TextOutput(saxHandler)); |
| |
| Alternatively the servlet can use a cache for storing |
| frequently accessed XML documents. This is not only a matter |
| of reading the initial input document from the cache, as |
| the translet may load other XML input documents as runtime. |
| (If the xsl:document() function was used in the stylesheet.) |
| |
| // Get a reference to the translet class |
| Class cls = Class.forName(transletName); |
| |
| // Instanciate a translet object (inherits AbstractTranslet) |
| AbstractTranslet translet = (AbstractTranslet)cls.newInstance(); |
| |
| // The translet needs a reference to the cache in case |
| // in needs to load additional XML documents. |
| translet.setDOMCache(cache); |
| |
| // Get the DOM from the DOM cache |
| DOMImpl dom = cache.retrieveDocument(documentURI, 0, translet); |
| |
| // Create output handler (you can plug in your own) |
| DefaultSAXOutputHandler saxHandler; |
| saxHandler = new DefaultSAXOutputHandler(out); |
| |
| // Start the transformation |
| translet.transform(dom, new TextOutput(saxHandler)); |
| |
| ------------------------------------------------------------ |
| BUILDING YOUR OWN DOM CACHE |
| |
| The interface for the DOM cache consists of a single method, |
| and its definition can be found in: |
| |
| org/apache/xalan/xsltc/DOMCache.java |
| |
| The method contained in the interface is: |
| |
| public DOMImpl retrieveDocument(String uri, |
| int mask, |
| Translet translet); |
| |
| The responsibilities of this method are: |
| |
| A) Build new a DOMImpl and DTDMonitor for XML documents |
| that are not already in the cache: |
| |
| // Instanciate a DOMImpl object |
| Parser parser = new Parser(); |
| DOMImpl dom = new DOMImpl(); |
| dom.setDocumentURI(uri); |
| parser.setDocumentHandler(dom.getBuilder()); |
| |
| // Use a DTDMonitor to track ID references in DTD |
| DTDMonitor dtdMonitor = new DTDMonitor(); |
| parser.setDTDHandler(dtdMonitor); |
| |
| // Parse the input document and build DOM |
| parser.parse(uri); |
| |
| At this point the DOMImpl and DTDMonitor objects are |
| populated with the necessary data. The two objects |
| are ready to be put in the cache (using the URI as |
| the lookup key). |
| |
| B) For each time a new document is requested by a translet: |
| |
| // Expand translet's index array to fit this DOM |
| translet.setIndexSize(dom.getSize()); |
| |
| // Build indices for this DOM's DTD's ID references |
| dtd.buildIdIndex(dom, mask, translet); |
| |
| // Pass unparsed entity URIs to the translet |
| translet.setUnparsedEntityURIs(dtd.getUnparsedEntityURIs()); |
| |
| Step A) must be done every time a document is read into the |
| cache, and step B) every time a document is given to a |
| translet. |
| |
| The XSLTC package contains an example implementation of a |
| DOM cache, based on a very simple round-robin caching |
| algorithm: |
| |
| org/apache/xalan/xsltc/dom/DocumentCache.java |
| |
| ------------------------------------------------------------ |
| END OF README |