<?xml version="1.0" standalone="no"?>
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!-- 
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 1999 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="&xslt4j-current;">
<!--note>A later Developer release has been posted in the <resource-ref idref="xslt4j-distdir"/>. For the changes that have occurred since &xslt4j-current;, consult the xml-xalan-cvs@apache.org mailing list, or download the release and consult the release notes.</note-->
  <s2 title="What is it?">
    <p>&xslt4j; is an XSLT processor for transforming XML documents into HTML, text, or other XML document types. It implements the
     W3C Recommendations for XSL Transformations (XSLT) and the XML Path Language (XPath). It can be used from the command line,
     in an applet or a servlet, or as a module in other program.</p>
  </s2>
  <s2 title="I've heard of &xslt4j;, but what is version 2?">
    <p>&xslt4j; version 2 recasts &xslt; as an implementation of the <link idref="trax">TRaX (Transformation API for XML)</link> interfaces, part of the <resource-ref idref="jaxp11"/>. TRaX provides a
    modular framework and a standard API for performing XML transformations, and it utilizes system properties to determine which Transformer and which XML parser to use.</p>
     <p>&xslt4j; version 2 also builds on <resource-ref idref="sax2"/>, <resource-ref idref="dom2"/>, and the XML parser API in
     <resource-ref idref="jaxp"/>.</p>
     <p>For more information, see <link idref="whatsnew">What's new in &xslt4j2;</link>.</p>
     <note>&xslt4j; version 1 is no longer supported and no longer available from xml.apache.org.</note>
  </s2>
  <s2 title="How about this release?">
  <p>&xslt4j-current; works with &xml4j; version 2, and the distribution includes xercesImpl.jar from &xml4j-used;. &xslt4j-current; is also
  compatible with &xml4j; version 1.</p>
  <p>Support for the &xslt4j; release 1 API, which predates the design of the JAXP 1.1/TrAX interfaces, has been dropped.</p>
  <p>The &xslt4j; implementation is in xalan.jar. The SAX, DOM, and JAVAX interfaces are in xml-apis.jar. These interfaces are shared by a 
  number of tools (&xslt4j;, &xml4j;, etc.), so placing them in a separate JAR simplifies coordination and reduces risk of duplication. 
  <em>Be sure to put both JAR files (and xercesImpl.jar or another JAXP 1.1-compliant XML parser) on your classpath!</em></p>
  </s2> 
  <s2 title="How do I get it?">
    <p>To get the binary distribution (all you need to use and develop applications with &xslt4j;), download and unzip either of the following:</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 &xslt4j; sources (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:</p>
    <ul>
      <li><resource-ref idref="xslt4j-dist-src-zip"/></li>
      <li><resource-ref idref="xslt4j-dist-src-targz"/></li>
    </ul>
  </s2>
  
  <s2 title="Where do I get Xerces?">
    <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>
  <s2 title="What else do I need?">
    <p>You need the Java Development Kit or Java Runtime 1.2.2, or 1.3.x, which you can obtain 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> 
  </s2>  
    <s2 title="For more information...">
    <p>For more information, go to <link idref="overview">&xslt4j; Overview</link> and <link idref="getstarted">Getting
    Started</link>. All of the &xslt4j; documentation on this website is included in the &xslt4j; download, as are a number of
    <link idref="samples">Samples</link> to help you start using &xslt4j2; to transform XML documents.</p>
  </s2>  
</s1> 