<?xml version="1.0" standalone="no"?>
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!--
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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>
