============================================================
CONTENTS OF THIS DOCUMENT:

  o) HOW TO PROVIDE XSL TRANSFORMATIONS AS A WEB SERVICE
  o) HOW TO INVOKE TRANSLETS FROM AN ENTERPRISE JAVA BEAN
  o) TIPS FOR RUNNING THE SAMPLE ON JBOSS-3.0.4_TOMCAT-4.1.12

------------------------------------------------------------
HOW TO PROVIDE XSL TRANSFORMATIONS AS A WEB SERVICE

With XSLTC, XSL transformations can be run from within a
an Enterprise Java Bean (EJB) and exported through a servlet.
This sample code demonstrates how that can be implemented.

The CompiledServlet and CompiledBrazil sample code
demonstrate other approaches to providing XSL transformations
as a web service.

------------------------------------------------------------
HOW TO INVOKE TRANSLETS FROM AN ENTERPRISE JAVA BEAN

 o) Create an EJB that implements SessionBean and has a
    single transform() entry point:

    public class TransformBean implements SessionBean {
        public String transform(String document, String transletName) {
            // instanciate translet
            // build internal DOM
            // run transformation
            :
            :
        }
        :
        :
    }

 o) Create this EJB's remote interface (this is the interface
    your servlet will use to call the bean's entry point):

    public interface TransformRemote extends EJBObject {
        public String transform(String document, String transletName) 
        throws RemoteException;
    }

 o) Create the EJB's home interface, which your servlet
    will use to instantiate the remote interface:

    public interface TransformHome extends EJBHome {
        TransformRemote create()
            throws CreateException, RemoteException;
    }

 o) Create a servlet that uses the EJB's home interface to
    create a remote interface to the EJB, and then calls
    the EJB's transform() method through that remote
    interface:

    public class TransformServlet extends HttpServlet {

        public void init(ServletConfig config) {
            // look up the EJB's home interface using JNDI
        }

        public void doGet (HttpServletRequest request, 
                           HttpServletResponse response) 
            throws ServletException, IOException {
            // create the remote interface
            // pass the parameters from teh request to the EJB
            // display results passed back from EJB
        }
    }

 o) Set up your J2EE_CLASSPATH to include JAXP and the XSLTC
    runtime jars.
 

 o) Compile your XSL stylesheets and place them either in
    your J2EE_CLASSPATH or wrap them in your EJB jar.
    Make sure that the XSLTC TransformerFactory will be used
    by either setting the system property
    "javax.xml.transform.TransformerFactory" with the value
    "org.apache.xalan.xsltc.trax.TransformerFactoryImpl", or
    by making a file with the name
    "META-INF/services/javax.xml.transform.TransformerFactory"
    containing the single line

       org.apache.xalan.xsltc.trax.TransformerFactoryImpl

    available on your J2EE_CLASSPATH.


 o) Deploy your EJB

 o) Call the servlet with the necessary parameters (at least
    an URI to the source XML document and the name of the
    translet class).

------------------------------------------------------------
TIPS FOR RUNNING THE SAMPLE ON JBOSS-3.0.4_TOMCAT-4.1.12

 o) Copy the bundled xalan.jar (a version containing XSLTC) 
    to %Jboss_Home%/server/default/lib directory.

 o) Put the translet .class file in the same directory as 
    the EJB classes.

 o) Set the value of the "translet" parameter to the name 
    of the translet .class

 o) Set the value of the "document" parameter to a valid xml 
    URI
------------------------------------------------------------
END OF README
