<?xml version="1.0" standalone="no"?>
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!--
 * Copyright 2001-2004 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
-->
<!-- $Id$ -->

<s1 title="XSLTC TrAX API">

  <s2 title="The JAXP/TrAX API">

  <p>XSLTC is 100% compliant with the TrAX poriton of the
  <jump href="http://java.sun.com/xml/jaxp/index.html">JAXP API</jump>. This
  API is a standard extension to Java and there is not much point in describing
  it in detail in this document.</p>

  </s2>

  <s2 title="XSLTC's extensions to JAXP/TrAX">

  <p>The <code>Source</code> and <code>Result</code> classes within TrAX are
  used to handle input and output documents. These classes can be extended to
  encapsulate additional input types. XSLTC's TrAX implementation contains an
  extension to the <code>Source</code> class:</p><source>
    org.apache.xalan.xsltc.trax.XSLTCSource</source>

  <p>This extension class can be used to build XSLTC's internal
  DOM and cache it for later usage. The following sample shows how to
  use it with a <code>Transformer:</code></p><source>
    public void run(String xmlfile, String xslfile) {

          // Create an XSLTCSource for the input XML document
          XSLTCSource source = new XSLTCSource(xmlfile);

          // Build a StreamSource for the stylesheet
          StreamSource stylesheet = new StreamSource(xslfile);

          // Create a Transformer instance and process the input
          Transformer transformer = factory.newTransformer(stylesheet);
          transformer.transform(source, new StreamResult(System.out));
	:
	:
    }</source>

  <p>If you do chose to implement a DOM cache, you should have your cache
  implement the <code>javax.xml.transform.URIResolver</code> interface so
  that documents loaded by the <code>document()</code> function are also read
  from your cache.</p>

  </s2>

</s1>
