<?xml encoding="US-ASCII"?>
<!--
 * 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.
-->

<!ENTITY xslt "Xalan">
<!ENTITY xslt4j "Xalan-Java">
<!ENTITY xslt4j2 "Xalan-Java 2">
<!ENTITY xslt4ji "&xslt4j; Interpretive">
<!ENTITY xslt4jc-short "XSLTC">
<!ENTITY xslt4jc-long  "&xslt4j; Compiled">
<!ENTITY xslt4j-dist-bin "&xslt4j-dist;-bin">
<!ENTITY xslt4j-dist-src "&xslt4j-dist;-src">
<!ENTITY xslt4j-dist "xalan-j_@version.VERSION@_@version.RELEASE@_@version.MINOR@">
<!ENTITY xslt4j-current "&xslt4j; Version @version.VERSION@.@version.RELEASE@.@version.MINOR@">
<!ENTITY xslt4j-distdir "http://www.apache.org/dyn/closer.cgi/xalan/xalan-j/">
<!ENTITY xslt4j_longname "Apache Xalan Java">
<!ENTITY xml4j "Xerces-Java">
<!ENTITY xml4j1 "Xerces-Java 1">
<!ENTITY xml4j2 "Xerces-Java 2">
<!ENTITY xml4j-used "&xml4j; @parser.version.VERSION@.@parser.version.RELEASE@.@parser.version.MINOR@">
<!ENTITY xml4j-jar "xercesImpl.jar">
<!ENTITY xslt4c "Xalan-C++">
<!ENTITY xml4c "Xerces-C++">
<!ENTITY jaxp13-short "JAXP 1.3">
<!ENTITY jaxp13-long  "Java API for XML Processing (JAXP) 1.3">
<!ENTITY download "The &xslt4j-current; download includes &xml4j-jar; from &xml4j-used; and xml-apis.jar. 
For version information about the contents of xml-apis.jar, see the JAR manifest.">

<!ENTITY xsltcwhatsnewhead '<li><link anchor="xsltc">&xslt4jc-short;</link></li>'>

<!ENTITY xsltcwhatsnew '<anchor name="xsltc"/><s2 title="&xslt4jc-long; (&xslt4jc-short;)">
                <p>In April 2001, Sun donated &xslt4jc-short; to the Xalan project. &xslt4jc-short; compiles stylesheets into translets and
                provides a runtime environment for using translets to transform XML documents. Initially, &xslt4jc-short; is
                available in a separate JAR. Over time, we plan to integrate the two codebases. For more information,
                see <link idref="xsltc_usage">Getting Started with &xslt4jc-short;</link>, 
                <link idref="readme" anchor="xsltcreleasenotes">&xslt4jc-short;
                Release Notes</link>, and <jump href="xsltc/index.html">&xslt4jc-short; Design</link>.</p>
                </s2>'>

<!ENTITY history2xsltc '<note>For &xslt4jc-short; changes since &xslt4jc-short; was incorporated into &xslt4j;, see
                        <link idref="xsltc_history">&xslt4jc-short; software changes</link>.</note>'>

<!ENTITY xsltcclasspath '<p>If you are using <link idref="xsltc_usage">&xslt4jc-short;</link>, see
                        <link idref="xsltc_usage" anchor="classpath">Setting the system classpath for &xslt4jc-short;</link>.</p>'>

<!ENTITY xsltcsampleshead '<li><link anchor="translets">translets</link></li>'>

<!ENTITY xsltcsamples '<anchor name="translets"/><s2 title="Translets">
                 <ul>
                 <li><link anchor="xsltc1">JAXPTransletOneTransformation</link></li>
                 <li><link anchor="xsltc2">JAXPTransletMultipleTransformations</link></li>
                 <li><link anchor="xsltcother">Other &xslt4jc-short; samples</link></li>   
                 </ul>
                 <p>You can use the JAXP interfaces to compile and run translets.
                 For an overview of the usage patterns these samples illustrate, see 
                 <link idref="xsltc_usage" anchor="api">Calling &xslt4jc-short; with the JAXP API</link>.</p>
                 <anchor name="xsltc1"/>
                 <s3 title="JAXPTransletOneTransformation">
                 <p>What it does: Uses the &xslt4jc-short; TransformerFactory to compile a translet and use
                 the translet to transform the &xslt4jc-short; to-do list from XML into HTML.</p>
                 <p>Run this sample from the translets subdirectory with</p>
                 <p><code>java JAXPTransletOneTransformation</code></p>
                 <p>View the result in todo.html.</p>
                 </s3><anchor name="xsltc2"/>
                 <s3 title="JAXPTransletMultipleTransformations">
                 <p>What it does: Uses the &xslt4jc-short; TransformerFactory to compile a translet and use
                 the Templates object associated with the translet to transform the &xslt4jc-short; and Xalan to-do lists from XML 
                 into HTML.</p>
                 <p>Run this sample from the translets subdirectory with</p>
                 <p><code>java JAXPTransletMultipleTransformations</code></p>
                 <p>View the results in todo.html and todotoo.html.</p>                
                 </s3><anchor name="xsltcother"/>
                 <s3 title="Other &xslt4jc-short; samples">
                 <p>Other &xslt4jc-short; samples are located in the following samples subdirectories:</p>
                 <ul>
                 <li>CompiledServlet</li>
                 <li>CompiledBrazil</li>
                 <li>CompiledJAXP</li>
                 <li>CompiledApplet</li>
                 <li>CompiledEJB</li>
                 </ul>
                 <p>For information about each of these samples, consult the README file in the subdirectory.</p>
                 <p>&xslt4jc-short; provides demos for using &xslt4jc-short; as a servlet and as a handler for
                 Brazil (a new and powerful Web techology from Sun labs).</p>
                 <p>To run the Brazil-handler demo, download Brazil from sunlabs:</p>
                 <p><code>&nbsp;&nbsp;&nbsp;&nbsp;<jump href="http://research.sun.com/research/download/index.html">http://research.sun.com/research/download/index.html</jump></code></p>
                 <p>The translet must be specified as a pure class name,
                 accessible through the Brazil-handler&apos;s classpath. For
                 example:</p>
                 <p><code>&nbsp;&nbsp;&nbsp;&nbsp;translet=mk054</code></p>
                 <p>The document must be specified as a valid URL. For example:</p>
                 <p><code>&nbsp;&nbsp;&nbsp;&nbsp;document=http://server/path/to/filename.xml</code></p>
                 <p>If the file is local to the Brazil handler, it has to be
                specified using the "file:filename.xml" format.</p>
                <note>In order to run the Brazil-handler demo, you also need to
                      make the Brazil and javax classes available from your
                      classpath</note>
                 <p>To run the servlet demo, download the java extensions for servlets from Sun:</p>
                 <p><code>&nbsp;&nbsp;&nbsp;&nbsp;
                 <jump href="http://java.sun.com/products/servlet/download.html">
                 http://java.sun.com/products/servlet/download.html</jump></code></p>
                 </s3>
                 </s2>'>
