<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!--
 * Copyright 1999-2004 The Apache Software Foundation.
 *
 * Licensed 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$ -->
<faqs title='Frequently asked questions'>
  <group title='General XSLT'>
    <faq title='Where do I go to learn about XSLT'>
      <q>Where do I go to learn about XSLT?</q>
      <a>
        <p>The definitive sources are the W3C XSLT and XPath recommendations:
          <resource-ref idref='xslt' /> and
          <resource-ref idref='xpath' />.
        </p>
        <p>For a brief listing of tutorials, discussion forums, and other materials, see
          <link anchor='uptospeed' idref='overview'>Getting up to speed with XSLT</link>.
        </p>
      </a>
    </faq>
    <faq title='Where can I ask questions about XSLT'>
      <q>Where can I ask questions about XSLT?</q>
      <a>
        <p><jump href='http://marc.theaimsgroup.com/?l=xalan-dev&amp;r=1&amp;w=2'>xalan-dev</jump> and
           <jump href='http://marc.theaimsgroup.com/?l=xalan-j-users&amp;r=1&amp;w=2'>xalan-j-users</jump>
           are for Xalan-Java questions only. This is not the best 
           forum to ask general XSLT questions. The <resource-ref idref='mulberryxsl-list' /> is an 
           excellent place to ask XSLT questions; please search
          <resource-ref idref='dpawsonxslfaq' /> to ensure your question has not been already asked.
        </p>
      </a>
    </faq>
    <faq title='TrAX and JAXP'>
      <q>What are TrAX and JAXP, and are they related?</q>
      <a>
      	<p><anchor name="trax"/></p>
        <p>TrAX is the Transformation API for XML. In November 2000, TrAX was revised and incorporated 
           into JAXP, the JAVA API for XML Processing. JAXP (including TrAX) provides users a standard, 
           vendor-neutral API for working with (and transforming) XML documents. You can use this API 
           to build applications that are not bound to the particular implementation details of a given 
           XML parser or XSL transformer.</p>
        <p>&xslt4j; includes the JAXP packages, implements the TrAX portion of 
           that API (javax.xml.transform....), implements the XPath API of JAXP (javax.xml.xpath....), 
           and includes xercesImpl.jar from  
           <resource-ref idref='xml4j-used' />, which implements the parser portion of the API 
           (javax.xml.parser....).</p>
        <p>For more information, see <link idref='trax'>Using the JAXP Transform APIs</link> and
          <resource-ref idref='jaxp13-longname-withacronym' />.
        </p>
      </a>
    </faq>
  </group>
  <group title='Versions'>
    <faq title='Determining &xslt4j; Version'>
      <q>How do I see what version of &xslt4j; I'm running? How do I determine 
         which parser I'm using?</q>
      <a>
        <p>
          <anchor name='environmentcheck' />
        </p>
        <p>
          <em>Using the EnvironmentCheck utility:</em> To help diagnose classpath problems and also 
              determine which version of &xslt4j; is being used, try running 
              &xslt4j;'s environment checking utility.
        </p>
        <p>You can run this utility from the command line as follows:</p>
        <p>
          <code>java org.apache.xalan.xslt.EnvironmentCheck [-out outFile]</code>
        </p>
        <p>You can also call this utility from within your application. For example,</p>
        <p>
          <code>boolean environmentOK = (new EnvironmentCheck()).checkEnvironment (yourPrintWriter);</code>
        </p>
        <p>Be sure to run EnvironmentCheck in the environment where you are experiencing the problem. 
           For example, if you get a NoClassDefFound error from a command-line application, run 
           EnvironmentCheck on the command line with exactly the same classpath. If the error occurs 
           inside your Java application (or in a servlet, etc.), be sure to call the EnvironmentCheck 
           checkEnvironment(...) method from within your running application.</p>
        <p>Best of all, you can call checkEnvironment from a stylesheet using extensions:</p>
        <source>
&lt;?xml version="1.0"?&gt;
&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:xalan="http://xml.apache.org/xalan"
    exclude-result-prefixes="xalan"&gt;
&lt;xsl:output indent="yes"/&gt;

&lt;xsl:template match="/"&gt;
  &lt;out&gt;
    &lt;xsl:copy-of select="xalan:checkEnvironment()"/&gt;
  &lt;/out&gt;
&lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;</source>
      </a>
    </faq>
    <faq title='Determining the Serializer Version'>
      <q>How do I see what version of the Serializer I'm running? </q>
      <a>
          <anchor name='serlializercheck' />          
        <p>
          Xalan's serialier is now shared with Xerces. It may be packaged in Xalan, or Xerces,
          or in the JRE itself. You can run the serializer's <em>Version</em> utility from the command line as follows:
        </p>
        <p>
          <code>java org.apache.xml.serializer.Version</code>
        </p>
        The output should indicate which serializer you are using.
      </a>
    </faq>
    <faq title='Which version of Xerces should I be using?'>
      <q>Which version of &xml4j; should I be using?</q>
      <a>
        <p><resource-ref idref='xslt4j-current' /> has been tested with <resource-ref idref='xml4j-used' />. 
           See <link anchor='status' idref='readme'>Status</link>.
        </p>
      </a>
    </faq>
    <faq title='Compatibility with &xslt4j; version 1'>
      <q>How do I run applications that use the &xslt4j; version 1 API with &xslt4j;</q>
      <a>
        <p>The &xslt4j; version 1 compatibility API has been deprecated and removed, so you 
           must use the &xslt4j; version 2 API. We strongly encourage you to use the 
           <resource-ref idref='jaxp13-longname-withacronym' />. For more information, see 
           the FAQ on <link anchor='trax'>TrAX and JAXP.</link></p>
      </a>
    </faq>
    <faq title='Issues running &xslt4j; on JDK 1.3'>
      <q>I'm having a problem building or running &xslt4j; on the JDK 1.3.</q>
      <a>
        <p><anchor name='jdk13'/></p>
        <p>The JDK 1.3 automatically places everything in the lib/ext directory in front of everything 
           you place on the classpath. If this directory contains a version of DOM, JAXP, or Xerces 
           that predates the &xslt4j; distribution you are using, you may have problems!</p>
        <p>The IBM JDK 1.3 includes an earlier version of xerces.jar in the lib/ext directory, a 
           version that does not implement the &jaxp13-short; interfaces and therefore does not work with the 
           current &xslt4j; release. Accordingly, you must either remove the 
           xerces.jar that is in that directory or replace it with the xercesImpl.jar that is included 
           with the &xslt4j; distribution.</p>
        <p>The SUN JDK 1.3 includes a pre-1.1 version of the JAXP in crimson.jar. Either remove the 
           crimson.jar in that directory or overwrite it with a newer crimson.jar that includes and 
           implements the &jaxp13-short; interfaces.</p>
      </a>
    </faq>
    <faq title='Issues running &xslt4j; on JDK/JRE 1.4 or higher'>
      <q>I'm having a problem running &xslt4j; on JDK/JRE 1.4 or higher</q>
      <a>
        <p><anchor name='jdk14'/></p>      
        <p>JDK/JRE 1.4, and JDK/JRE 5.0 is packaged with an old version of Xalan-Java. The JDK/JRE 
           will attempt to use this version instead of any on the classpath. Unfortunately, 
           this causes problems when attempting to use a newer version of &xslt4j;.</p>
        <p>You can always determine which version of &xslt4j; you are running 
           by using the <link anchor='environmentcheck'>EnvironmentCheck</link> class or by using the 
           xalan:checkEnvironment extension function. It is highly recommended that you use this 
           method to verify the version of &xslt4j; you are running, especially 
           before opening a bug report.</p>
        <p>To use a newer version of &xslt4j; and override the one packaged with the JDK:</p>
        <ul>
          <li>use the
            <resource-ref idref='endorsed' />. Place the xalan.jar, serializer.jar, xercesImpl.jar 
            and xml-apis.jar in the 
            &lt;java-home&gt;\lib\endorsed directory, where
            &lt;java-home&gt; is where the runtime software is installed.
          </li>
        </ul>
        <p>The following methods
          <em>do not work</em>:
        </p>
        <ul>
          <li>Using the CLASSPATH environment variable or using -classpath to place the new classes 
              in the classpath.</li>
          <li>Using the -jar option to explicitly execute the classes inside the new jar files.</li>
        </ul>
      </a>
    </faq>
    <faq title='Issues running &xslt4j; on Tomcat with JDK 1.4'>
      <q>I got java.lang.IllegalAccessError running &xslt4j; on Tomcat with JDK 1.4.</q>
      <a>
        <p><anchor name='tomcat'/></p>
        <p><jump href="http://tomcat.apache.org/index.html">jakarta-tomcat 4.1.*</jump> is packed
           with an old version of xercesImpl.jar. Based on the <resource-ref idref='endorsed' />, you should
           replace it with the newer xercesImpl.jar. You should add a newer xalan.jar and serializer.jar 
           to Tomcat as well.  
           Read the FAQ about <link anchor='jdk14'>Issues running &xslt4j; on JDK/JRE 1.4 or higher</link>. Place the 
           xalan.jar, serializer.jar, and xercesImpl.jar in the &lt;Tomcat_Home&gt;\common\endorsed directory, where 
           &lt;Tomcat_Home&gt; is where the Tomcat application server is installed.</p>
      </a>
    </faq> 
    <faq title='Issues running Applets with &xslt4jc-short; in Web Browsers with JAVA Plug-in (JRE 1.4)'>
      <q>I got javax.xml.transform.TransformerException running my applet which uses &xslt4jc-short; in JRE 1.4.</q>
      <a>
        <p><anchor name='applet'/></p>
        <p>To overwrite an older version of Xalan Java; packaged with JRE 1.4 or higher you can add a newer 
        xalan.jar and serializer.jar to the &lt;jre-home&gt;\lib\endorsed directory. Read the FAQ about 
        <link anchor='jdk14'>Issues running 
        &xslt4j; on JDK/JRE 1.4 or higer</link>.  If there is a META-INF/services/javax.xml.transform.TransformerFactory
        file in xalan.jar (as there is in the Xalan Java distributions), then the TransformerFactoryImpl 
        setting in this file will be used by the JVM during the factory finder lookup procedure.  
        The TransformerFactoryImpl for the Xalan Java Interpretive processor is the default setting in the 
        META-INF/services/javax.xml.transform.TransformerFactory file, therefore, you will get an error
        when your applet attempts to use the &xslt4jc-short; implementation.</p>
        <p>To work around this problem, you can change the contents of the 
        META-INF/services/javax.xml.transform.TransformerFactory file in xalan.jar so that it refers to the
        transformer factory class implementation for &xslt4jc-short;, org.apache.xalan.xsltc.trax.TransformerFactoryImpl. </p>
        <p>Another solution is to create a jar that contains a META-INF/services/javax.xml.transform.TransformerFactory file 
        containing the value org.apache.xalan.xsltc.trax.TransformerFactoryImpl.  Place the jar in the 
         &lt;jre-home&gt;\lib\endorsed directory. When you name your jar file, the ASCII code of the first 
        character should be smaller than the ASCII code of "X" to ensure that your jar will be loaded before 
        xalan.jar</p>
      </a>
    </faq>        
    <faq title="Using the 'signature' file to verify a download">
      <q>How do I use the "signature" file to verify my download?</q>
      <a>
        <p>For each &xslt4j; download file there is a corresponding signature file. 
        The signature file for xalan-j_2_0_1.tar.gz, for example, is xalan-j_2_0_1.tar.gz.sig.
        </p>
        <p>The .sig files are PGP signatures of the actual .zip or .tar.gz
        download files.  You can use these files to verify the authenticity of the download. You do not 
        need the .sig file to use the corresponding download file.</p>
        <p>To check the authenticity of a &xslt4j; distribution, you need a copy of
        PGP which is available in a number of licenses, including some free
        non-commercial licenses, either from an mit.edu site or on
        the pgp.com site. Once you have a version of PGP installed, you
        should be able to 'verify the signature' of the .sig file, which basically verifies that the 
        corresponding .zip or tar.gz file has not been changed since we signed it.</p>
        <p>The PGP key can be found in 
        <jump href='http://svn.apache.org/viewvc/xalan/java/trunk/KEYS'>KEYS.</jump></p>
      </a>
    </faq>
  </group>
  <group title='Performance Issues'>
    <faq title='Speeding up transformations'>
      <q>What can I do to speed up transformations?</q>
      <a>
        <p>In the ongoing development of &xslt4j;, enhancing performance is 
           the primary goal of the &xslt4j; team.  Here are some preliminary 
           suggestions for you to keep in mind as you set up your applications:</p>
        <ul>
          <li>Use a Templates object (with a different Transformers for each transformation) to 
              perform multiple transformations with the same set of stylesheet instructions (see
            <link anchor='multithreading' idref='usagepatterns'>Multithreading</link>).
            <br />
            <br />
          </li>
          <li>Set up your stylesheets to function efficiently.
            <br />
            <br />
          </li>
          <ul>
            <li>Don't use "//" (descendant axes) patterns near the root of a large document.
              <br />
              <br />
            </li>
            <li>Use xsl:key elements and the key() function as an efficient way to retrieve node sets.
              <br />
              <br />
            </li>
            <li>Where possible, use pattern matching rather than xsl:if or xsl:when statements.
              <br />
              <br />
            </li>
            <li>xsl:for-each is fast because it does not require pattern matching.
              <br />
              <br />
            </li>
            <li>Keep in mind that xsl:sort prevents incremental processing.
              <br />
              <br />
            </li>
            <li>When you create variables, <br/><code>&lt;xsl:variable name="fooElem" select="foo"/&gt;</code><br/> is usually faster than
              <br/><code>&lt;xsl:variable name="fooElem"&gt;&lt;xsl:value-of-select="foo"/&gt;&lt;/xsl:variable&gt;</code>
              <br />
              <br />
            </li>
            <li>Be careful using the last() function.
              <br />
              <br />
            </li>
            <li>The use of index predicates within match patterns can be expensive.
              <br />
              <br />
            </li>
            <li>Decoding and encoding is expensive.
              <br />
              <br />
            </li>
          </ul>
          <li>For the ultimate in server-side scalability, perform transform operations on the client. 
              For examples, see
            <link anchor='appletxmltohtml' idref='samples'>appletXMLtoHTML</link> and
            <link anchor='get-todo-list' idref='samples'>get-todo-list</link>.
          </li>
        </ul>
      </a>
    </faq>
    <faq title="JAXP factory lookup procedure">
      <q>What is the JAXP factory lookup procedure and does it affect performance?</q>
      <a>
      <p>JAXP uses an ordered lookup procedure to find factory implementations, such as
         an implementation of javax.xml.transform.TransformerFactory.  For information
         on this procedure, refer to Section 3 Plugability in <resource-ref idref='jaxp13'/>.  
       </p>
       <p>In most cases, Factory classes need only be looked up once for an application, so
          performance is not an issue.  However, there may be scenarios where the lookup
          procedure executes multiple times which could impact performance.  In these cases,
          users may want to set system properties or populate the jaxp.properties file in order
          to shorten the time spent in the lookup procedure.
       </p>   
      </a>
    </faq>
  </group>
  <group title='Namespace Related'>
    <faq title='Retrieving nodes in the default namespace'>
      <q>XPath isn't retrieving nodes that are in the default namespace I defined. How do I get them?</q>
      <a>
        <p>If you are looking for nodes in a namespace, the XPath expression must include a namespace 
           prefix that you have mapped to the namespace with an xmlns declaration. If you have declared 
           a default namespace, it does not have a prefix (see 
           <jump href='http://www.w3.org/TR/xpath.html#node-tests'>XPath Node Tests</jump>). In order 
           to construct XPath expressions to retrieve nodes from this namespace, you must add a 
           namespace declaration that provides a prefix you can include in the XPath expressions.</p>
        <p>Suppose, for example, you you want to locate nodes in a default namespace declared as follows:
          <br />
          <code>xmlns="http://my-namespace"</code>
        </p>
        <p>Add a namespace declaration with a prefix:
          <br />
          <code>xmlns:foo="http://my-namespace"</code>
        </p>
        <p>Then you can use foo: in your XPath expression.</p>
        <p>Hint: Avoiding the use of default namespaces will prevent this problem from occuring.</p>
      </a>
    </faq>
    <faq title='Setting the parser to be namespace aware'>
      <q>
        How do I set my parser to be namespace aware?
      </q>
      <a>
        <p><anchor name='namespace-aware' /></p>
        <p>If you use a TransformerFactory to process a stylesheet Source and generate a Transformer, 
           the TransformerFactory instructs the SAXParserFactory to set the parser's namespaceAware 
           property to true. But if you call the parser directly, you may need to set the namespaceAware 
           property yourself. for example:</p>
        <source>javax.xml.parsers.SAXParserFactory spFactory =
  javax.xml.parsers.SAXParserFactory.newInstance();
spFactory.setNamespaceAware(true);</source>
        <note>For more information about setting the namespaceAware property, and SAX2 vs. JAXP default 
              settings, see <jump href='http://people.apache.org/~edwingo/jaxp-faq.html#nsDefaults'>JAXP FAQ: 
              Warning about namespace processing defaults</jump>.
        </note>
      </a>
    </faq>
  </group>
  <group title='Common Errors'>
    <faq title='NoClassDefFound errors'>
      <q>I'm getting a NoClassDefFound error. What has to be on the classpath?</q>
      <a>
        <ol>
          <li>xalan.jar, serializer.jar, xml-apis.jar, and xercesImpl.jar -- or the XML parser you are using -- must 
              always be on the classpath.
            <br />
            <br />
          </li>
          <li>To run the samples in the samples subdirectories, xalansamples.jar must be on the 
              classpath. To run the servlet samples, you must place xalanservlet.war 
              on a web server with a servlet engine and you must put the javax.servlet and
              javax.servlet.http packages on the classpath.  These packages 
              are available via the servlet.jar file found in Apache Tomcat ( see <resource-ref 
              idref="tomcat"/> ).
            <br />
            <br />
          </li>
          <li>To run extensions which use the component and script extension elements (including the 
              samples in samples/extensions), bsf.jar must be on the classpath. To run extensions 
              implemented in JavaScript, js.jar must also be on the classpath. For information on what 
              you need to run extensions implemented in other scripting languages, see
              <link anchor='supported-lang' idref='extensions'>Supported languages</link>.
          </li>
        </ol>
    You can check the correctness of your environment with the
        <link anchor='environmentcheck'>EnvironmentCheck</link> feature.
        <p>For more information, see
          <link anchor='classpath' idref='getstarted'>Setting up the system classpath</link>.
        </p>
      </a>
    </faq>
    <faq title='a &quot;DOM006 Hierarchy request error&quot;'>
      <q>Why do I get a "DOM006 Hierarchy request error" when I try to transform into a DOM Document node?</q>
      <a>
        <p>This error occurs when &xslt4j; tries to add a Node to a Document node 
           where it isn't allowed. For example, attempting to add non-whitespace text to the DOM Document 
           node produces this error.</p>
        <p>The error can also occur when a Document node is created with the DOMImplementation 
           createDocument() method, which takes a qualified name as an argument and creates an element 
           node.  If you then pass the returned Document node to &xslt4j;, you 
           get a "DOM006 Hierarchy request error" when &xslt4j; tries to add a 
           second element to the Document node. The solution is to either use the DocumentBuilder 
           newDocument() method to create a Document that does not contain an element node, or use a 
           DocumentFragment. It should be noted that the DocumentBuilder newDocument() method is 
           "Non-preferred" according to the &jaxp13-short; documentation.</p>
      </a>
    </faq>
    <faq title='Namespace not supported by SAXParser'>
      <q>Why am I getting a "Namespace not supported by SAXParser exception?</q>
      <a>
        <p>We have seen this problem arise for two quite different reasons:</p>
        <ul>
          <li>SAX1 interfaces are on your classpath in front of the SAX2 interfaces provided with 
              your XML parser.
            <br />
            <br />
  or
            <br />
            <br />
          </li>
          <li>The parser you are using to process a stylesheet Source and generate a Transformer does 
              not have the namespaceAware property set to true.</li>
        </ul>
        <p>
          <em>SAX1 on the classpath</em>
        </p>
        <p>SAX1 should not be on your classpath. The SAX1 interfaces and implementations of the SAX1 
           SAX parser are not namespace aware.</p>
        <p>To help diagnose your classpath, you can use the
          <link anchor='environmentcheck'>EnvironmentCheck
  utility</link>. If you are running under JDK 1.3, see
          <link anchor='jdk13'>Issues running &xslt4j; on JDK
  1.3</link>. If you are running a servlet, make sure the webserver is not placing SAX1 on the
  classpath.
        </p>
        <p>When you create a Transformer, you must use a
          <link anchor='namespace-aware'>namespace-aware</link> parser to parse the stylesheet.
        </p>
      </a>
    </faq>
    <faq title='Missing xsl:version attribute error'>
      <q>I'm getting an error about my stylesheet missing the xsl:version attribute - what's wrong?</q>
      <a>
        <p>There are two common causes for this error.</p>
        <ol>
          <li>Using the wrong URI for the xsl: prefix will cause this message. URIs, and namespace 
              URIs in particular, are case sensitive. Ensure the URI for the xsl namespace is 
              "http://www.w3.org/1999/XSL/Transform".<br/><br/></li>
          <li>The parser you are using to process a stylesheet Source and generate a Transformer 
              does not have the namespaceAware property set to true.<br/>
          When you create a Transformer, you must use a <link anchor='namespace-aware'>namespace-aware</link> parser to parse the stylesheet.</li>
        </ol>
      </a>
    </faq>
    <faq title='StackOverflowError with recursive stylesheet'>
      <q>&xslt4j; dies with a java.lang.StackOverflowError when I run a deeply 
         recursive stylesheet. The same stylesheet worked fine in the past (or on other machines). 
         What's happening?</q>
      <a>
        <p>That may not be our fault.  As of JDK 1.3.x, many Java Virtual Machine publishers reduced 
           the default size of a thread's call stack from 1MB to 256KB. This allows more threads to 
           run simultaneously, but it means that each thread is more limited in how deeply its function 
           calls can be nested.</p>
	<p>Some JVMs may offer an option that allows you to raise this limit. For example, in Sun 
	   JDK 1.3.1 you can start JVM with the -Xss1m option to allow each thread to use a full 
	   megabyte.  In IBM's JDK you can start with the -Xss1m and -Xoss1m options.  Other JVMs 
	   may set this in other ways, or may not allow you to control it at all; check the 
	   documentation on your system for details.</p>
        <p>Note too that on some platforms 1MB is an architectural upper limit on the stack size, so 
           setting -Xss2m (or equivalent) may not allow deeper recursion than -Xss1m.</p>
      </a>
    </faq>
    <faq title='OutOfMemoryError processing multiple documents'>
      <q>I get a java.lang.OutOfMemoryError when I try to process multiple documents with the 
         document() function. What can I do?</q>
      <a>
        <p>As a general rule, &xslt4j; currently caches all of the documents 
           that you read in with the document() function during a transformation.</p>
        <p>If your objective is to transform a series of documents, you can break the process into a 
           series of transformations. The
          <link anchor='pipedocument' idref='extensionslib'>PipeDocument</link> extension element 
          provides one strategy for batching a series of parallel transformations.</p>
        <p>Another alternative is to place your document() call in the select attribute of an 
           xsl:for-each instruction element and use a custom PI (Processing Instruction) to turn off 
           document caching. Include an XPath expression in your document() call if you do not 
           need to process the entire document.</p>
        <p>Sample stylesheet fragment:</p>
        <source>
&lt;xsl:template match="doc"&gt;
  &lt;xsl:for-each select="document(@href)/bar/zulu"&gt;
    &lt;?xalan-doc-cache-off?&gt;
    &lt;!-- process each document --&gt;
  &lt;xsl:for-each&gt;
&lt;/xsl:template&gt;</source>
        <note>PIs do not ordinarily uses namespaces, so "xalan:" is a 'fake' namespace we have 
        included to indicate that this is not a standard PI.</note>
        <p>If you include an XPath expression in your document() call, you can also turn on
          <link anchor='incremental' idref='dtm'>incremental transform</link> to eliminate the need 
          to read in the entire document. In fact, you can take advantage of the incremental transform 
          feature even if you are not turning off document caching.
        </p>
        <p>You can also increase your JVM heap size with the -Xmx or -mx flag, depending on which JVM 
           you are using (you can include both flags, and the JVM will ignore the one it doesn't 
           understand). For example, to give your JVM 64 meg, try
          <br />
          <code> java -Xmx64m -mx64m
            <ref>Class</ref>
          </code>
        </p>
      </a>
    </faq>
    <faq title="File Not Found error">
      <q>Why do I get 'file not found' when I pass c:\path\filename.txt?</q>
      <a>
        <p>&xslt4j; often requires legal URLs as system identifiers, not local 
           pathnames (this is partly due to underlying parsers requiring this). A simple (but not always 
           correct!) way to change a local pathname into a URL in Java 1.1x is:</p>
        <source>
  public static String filenameToURL(String filename)
  {
    File f = new File(filename);
    String tmp = f.getAbsolutePath();
    if (File.separatorChar == '\\')
    {
      tmp = tmp.replace('\\', '/');
    }
    // Note: gives incorrect results when filename already begins with
file:///
    return "file:///" + tmp;
  }
        </source>
        <p>For a slightly more detailed example, see org.apache.xml.utils.SystemIDResolver.</p>
      </a>
    </faq>
    <faq title="No more DTM IDs are available">
       <q>What does: "XSLT Error (javax.xml.transform.TransformerException): 
          org.apache.xml.dtm.DTMException: No more DTM IDs are available" mean?</q>
       <a>
         <p>It means you are probably using a very old version of Xalan or &xslt4j;, 
            likely the version 2.2D11 which was packaged in JDK1.4.  Architectural changes made in 
            early 2002 should have eliminated this issue for almost all cases.</p>
         <p>You should verify the version of &xslt4j; you are using by running 
            the <link anchor='environmentcheck'>EnvironmentCheck</link> utility, 
            and read the FAQ about <link anchor='jdk14'>Issues running &xslt4j;
            on JDK 1.4</link>.</p>
        </a>        
    </faq>
    <faq title='IllegalAccessError or could not load output_xml.properties
                on JDK 1.4'>
      <q>Why do I get a "java.lang.IllegalAccessError" or the message
         "Could not load the property file 'output_xml.properties'" when I try
         to transform using &xslt4jc-short; or &xslt4ji;?</q>
      <a>
        <p>These errors may occur if you use JDK 1.4 or later releases.</p>
        <p>JRE 1.4 and later releases contain copies of &xslt4j;.  In some
        cases, the JRE includes only &xslt4ji;, while in other cases it also
        includes &xslt4jc-short;.  Typically, the copy of the processor packaged
        with the JRE will be loaded in preference to any copy of &xslt4j; on
        your class path.</p>
        <p>Beginning with &xslt4j; 2.5, &xslt4ji; and &xslt4jc-short; are both
        packaged in xalan.jar, and share some of the same classes.  If you
        are using a version of the JRE that contains &xslt4ji;, but not
        &xslt4jc-short;, and you try to use &xslt4jc-short; on your class path,
        classes from that version of &xslt4jc-short; may be loaded along with
        classes from the version of &xslt4j; packaged with your JRE.</p>
        <p>Because the classes may be from different versions of &xslt4j;, the
        results may be unpredictable.  In particular, a
        <code>java.lang.IllegalAccessError</code> may be thrown, or an
        <code>org.apache.xml.utils.WrappedRuntimeException</code> containing
        the message:  <code>"Could not load the property file
        'output_xml.properties' for output method 'xml' (check
        CLASSPATH)"</code> may be thrown.</p>
        <p>To work around those problems, please read the FAQ entitled
        <link anchor='jdk14'>Issues running &xslt4j; on JDK 1.4</link>.</p>
      </a>
    </faq>    
  </group>
  <group title='Miscellaneous'>
    <faq title='Chaining transformations'>
      <q>How do you chain together a series of transformations?</q>
      <a>
        <p>&xslt4j; supports two strategies for chaining together a series of 
           transformations such that the output of each transformation provides input for the next 
           transformation.</p>
        <ul>
          <li>For each transformation in the series, you can set one SAX ContentHandler to process 
              the input, and another ContentHandler to process the output.
            <br />
            <br />
          </li>
          <li>You can also set up a series of parent-child relationships between an XMLReader and 
              one or more XMLFilters.</li>
        </ul>
        <p>For the details and links to examples, see
          <link anchor='outasin' idref='usagepatterns'>Using transformation output as input for 
          another transformation</link>.</p>
      </a>
    </faq>
    <faq title='Stylesheet validation'>
      <q>How do I validate an XSL stylesheet?</q>
      <a>
        <p>An XSL stylesheet is an XML document, so it can have a DOCTYPE and be subject to 
           validation, right?</p>
        <p>The XSLT Recommendation includes a
          <jump href='http://www.w3.org/TR/xslt#dtd'>DTD Fragment 
          for XSL Stylesheets</jump> with some indications of what you need to do to create a 
          complete DTD for a given stylesheet. Keep in mind that stylesheets can include literal 
          result elements and produce output that is not valid XML.</p>
        <p>You can use the xsl:stylesheet doctype defined in xsl-html40s.dtd for stylesheets that 
           generate HTML.</p>
      </a>
    </faq>
    <faq title='Setting output encoding'>
      <q>Why is the output character encoding I set in the stylesheet not being used?</q>
      <a>
        <p>If you use a character output stream to instantiate the
          <jump href='apidocs/javax/xml/transform/stream/StreamResult.html'>StreamResult</jump> object 
          which holds the transformation output, the Writer uses its own encoding, not the encoding 
          you specify in the stylesheet.</p>
        <p>If you want to use the stylesheet output encoding, do not use StreamResult(java.io.Writer) 
           to instantiate the holder for the output. Alternatively, you can specify the encoding when 
           you create a Writer (java.io.OutputStreamWriter). Once the Writer exists, you cannot change 
           its encoding. If the transformation is run in a servlet, it is possible
           that the Writer is coming from the ServletResponse object.
        </p>
        <p>
          If the stylesheet is run using the JAXP APIs and the Transformer's setOutputProperty() 
          method is invoked, it is possible to set the <em>"encoding"</em> property and
          over-ride the value in the stylesheet.
        </p>
      </a>
    </faq>
    <faq title='Getting line and column numbers for errors in XML input documents and XSL stylesheets'>
      <q>How do I get line numbers for errors in the XML or XSL input when I am performing a 
         transformation?</q>
      <a>
        <p>Use or mimic the command-line processor (<jump 
                       href='apidocs/org/apache/xalan/xslt/Process.html'>org.apache.xalan.xslt.Process</jump>).
        </p>
        <p>A
          <jump href='apidocs/javax/xml/transform/TransformerException.html'>TransformerException</jump> generally wraps another exception, often a SAXParseException. The command-line processor uses the static
          <jump href='apidocs/org/apache/xml/utils/DefaultErrorHandler.html'>org.apache.xml.utils.DefaultErrorHandler</jump> printLocation() method to chase down the exception cause and get a
          <jump href='apidocs/javax/xml/transform/SourceLocator.html'>SourceLocator</jump> that can usually report line and column number.
        </p>
        <p>Suppose you wanted to modify the ValidateXMLInput sample in the samples/Validate 
           subdirectory to include line and column numbers . All you need to do is call 
           DefaultErrorHandler.printLocation() in the the Handler internal class error() and warning() 
           methods. For example, replace</p>
        <source>public void error (SAXParseException spe)
  throws SAXException
{
  System.out.println("SAXParseException error: " + spe.getMessage());
}</source>
        <p>with</p>
        <source>public void error (SAXParseException spe)
  throws SAXException
{
  PrintWriter pw = new PrintWriter(System.out, true);
  org.apache.xml.utils.DefaultErrorHandler.printLocation(pw, spe);
  pw.println("SAXParseException error: " + spe.getMessage());
}</source>
        <p>You can also replicate code from the printLocation() method to obtain a SourceLocator, and 
           then use the SourceLocator getLineNumber() and getColumnNumber() methods. The 
           getRootSourceLocator() method below returns a SourceLocator.</p>
        <source>
import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.apache.xml.utils.SAXSourceLocator;
import org.apache.xml.utils.WrappedRuntimeException;
....
public static SourceLocator getRootSourceLocator(Throwable exception)
{
  SourceLocator locator = null;
  Throwable cause = exception;
    
  // Try to find the locator closest to the cause.
  do
  {
    if(cause instanceof SAXParseException)
    {
      locator = new SAXSourceLocator((SAXParseException)cause);
    }
    else if (cause instanceof TransformerException)
    {
      SourceLocator causeLocator = 
                    ((TransformerException)cause).getLocator();
      if(null != causeLocator)
        locator = causeLocator;
    }
    if(cause instanceof TransformerException)
      cause = ((TransformerException)cause).getCause();
    else if(cause instanceof WrappedRuntimeException)
      cause = ((WrappedRuntimeException)cause).getException();
    else if(cause instanceof SAXException)
      cause = ((SAXException)cause).getException();
    else
      cause = null;
  }
  while(null != cause);
        
  return locator;
}</source>
        <note>
          <em>&xslt4j; exception handling:</em>  The exception architecture 
          in &xslt4j; and with transforms in general is tricky because of 
          multiple layers of exception handling, involving movement back and forth between SAX and 
          Transformer exceptions and across pipes. &xslt4j; often uses a 
          WrappedRuntimeException to throw over many layers of checked exceptions, in order not to 
          have every possible checked exception be declared for every function in the stack, which 
          means it has to catch this exception at the upper levels and unwrap the exception to pass 
          it on as a TransformerException.
          <br />
          <br />A &jaxp13-short; TransformerException often wraps another exception. Two of the 
          TransformerException structures that are frequently used to construct contained exceptions 
          in &jaxp13-short; do not set the locator.  The locator is not set because we don't know the type 
          of exception that the Throwable argument represents.  The solution is to chase up the 
          contained exceptions to find the root cause, which will usually have a location set for 
          you.  This can be somewhat tricky, as not all the exceptions may be TransformerExceptions.  
          A good sample is in the DefaultHandler static printLocation() method, which the 
          &xslt4j; command-line processor uses to report errors. You can also 
          roll your own functions along the lines of the getRootSourceLocator() example above.
        </note>
      </a>
    </faq>
    <faq title='Servlet unable to find classes for extension functions/elements'>
      <q>My servlet cannot find classes that implement extension functions or elements. What can I do?</q>
      <a>
        <p>If you install xalan.jar in the webserver's lib directory (e.g., tomcat/lib), as 
           opposed to the servlet application's lib directory, then the &xslt4j; classes 
           are loaded by a classloader that does not see the classes in the application's classloader 
           (i.e., the extension classes, if you placed them there). The &xslt4j;
           classes try to load the extension classes using their own classloader, and that attempt 
           fails.</p>
        <p>Workaround: place xalan.jar in the servlet application's lib directory and NOT in the webserver's 
           lib directory. Another workaround is to place the extension classes also in the webserver's
           lib directory, but you generally want to avoid cluttering that directory.</p>
        <p>Thanks to Gunnlauger Thor Briem (gthb@dimon.is) for providing this information.</p>
      </a>
    </faq>
    <faq title="Translet name doesn't match stylesheet name">
      <q>My stylesheet is named <code>foo-bar.xsl</code>, but &xslt4jc-short;
         created a translet named <code>foo_bar</code>.  Is that a bug?</q>
      <a>
        <p>No.  The name of a translet is usually the name of the stylesheet,
           the name specified using the <code>translet-name</code> attribute on
           the &xslt4jc-short; <code>TransformerFactory</code> or the name
           specified for the translet on the command-line invocation.
           However, the name of the translet is also the name of a Java class.
           Any character that is not permitted in a class name is replaced with
           an underscore.</p>
      </a>
    </faq>
  </group>
</faqs>
