<?xml version="1.0" standalone="no"?>  
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!--
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 2003 The Apache Software Foundation.  All rights 
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:  
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Xalan" and "Apache Software Foundation" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written 
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation and was
 * originally based on software copyright (c) 1999, Lotus
 * Development Corporation., http://www.lotus.com.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 -->
<s1 title="Downloads &amp; Dependencies">
<ul>
  <li><link anchor="download">Downloading what you need</link></li>
  <li><link anchor="whereis_xml4j">Where do I get &xml4j;? </link></li>
</ul>
<anchor name="download"/>
<s2 title="Downloading what you need">
<p>To use &xslt4j;, you need the following:</p> 
  <ul>
    <li>The JDK or JRE 1.2.2, 1.3.x, or 1.4.x</li>
    <li>xalan.jar</li>
    <li>xml-apis.jar</li>
    <li>&xml4j-jar;, or another <link idref="usagepatterns" anchor="plug">XML Parser</link></li>
  </ul>
  <p>You can get the JDK or JRE from <jump href="http://www.ibm.com/java/jdk">ibm.com/java/jdk/</jump> 
     or <jump href="http://www.java.sun.com">java.sun.com</jump>.</p> 
     
  <p>There are 2 binary distributions available; you only need to choose one of them. The first 
     binary distribution contains the Xalan Interpretive processor and the Xalan Compiled processor 
     (XSLTC) and the runtime support packages into a single jar, called xalan.jar.  The second binary 
     distribution contains the Xalan Interpretive processor in xalan.jar and the Xalan Compiled 
     processor (XSLTC) and the runtime support packages in xsltc.jar.  The runtime support packages
     required by XSLTC are: java_cup runtime version 0.10j, bcel version 5.0, and regexp version 1.2.
     Both binary distributions contain xml-apis.jar (the JAXP 1.2 implementation) and 
     &xml4j-jar; from <resource-ref idref="xml4j-used"/>.</p>
     
  <p>To get the first &xslt4j; binary distribution, download and unzip either of the following from 
     the <resource-ref idref="xslt4j-distdir"/>:</p>
    <ul>
      <li><resource-ref idref="xslt4j-dist-bin-zip"/></li>
      <li><resource-ref idref="xslt4j-dist-bin-targz"/></li>
    </ul>
    
  <p>To get the second &xslt4j; binary distribution, download and unzip either of the following from 
     the <resource-ref idref="xslt4j-distdir"/>:</p>
    <ul>
      <li><resource-ref idref="xslt4j-dist-bin-2jars-zip"/></li>
      <li><resource-ref idref="xslt4j-dist-bin-2jars-targz"/></li>
    </ul>    

  <p>To get the &xslt4j; source distribution (with which you can do your own &xslt4j; build; see 
     <link idref="readme" anchor="build">Build notes</link>), download and unzip either of the 
     following from the <resource-ref idref="xslt4j-distdir"/>:</p>
    <ul>
      <li><resource-ref idref="xslt4j-dist-src-zip"/></li>
      <li><resource-ref idref="xslt4j-dist-src-targz"/></li>
    </ul>

  <p>To access previous releases, see the <resource-ref idref="xslt4j-distdir-previous"/>.</p>
  
  <p>If you plan to run <link idref="extensions">XSLT extensions</link> implemented in languages
     other than Java, then you will need bsf.jar, which is included in both the &xslt4j; binary 
     and source distributions. if you plan to run XSLT extensions implemented in scripting 
     languages, you will need bsf.jar and one or more additional files as indicated in 
     <link idref="extensions" anchor="supported-lang">extensions language requirements</link>.</p>
</s2>
<anchor name="whereis_xml4j"/>
<s2 title="Where do I get &xml4j;?">
<p>The &xslt4j; download includes &xml4j-jar; from &xml4j-used;. In conjunction with xml-apis.jar, 
this is all you need to run &xslt4j; with the &xml4j; XML parser. You can, however, download the 
complete &xml4j; binary or source distribution from the <resource-ref idref="xml4j-distdir"/>.</p>
<note>If you plan to use a different XML parser, see <link idref="usagepatterns" anchor="plug">Plugging 
in a Transformer and XML parser</link>.</note> 
</s2>
</s1>