<?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; is a developer release that 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>
  <p>&xslt4j-current; also introduces support for <link idref="extensionslib" anchor="exslt">EXSLT extensions </link>.</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>
    <p>To access previous releases, see the <resource-ref idref="xslt4j-distdir-previous"/>.</p>
  </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> 