<?xml version="1.0"?>
<!--
 * 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.
-->
<?xm-well_formed path="E:\xml-xalan\java\bugs.dtd"?>
<!-- This should contain *only* SPRs (Software Problem Reports) for the TrAX API 
     interfaces and classes. -->
<Sprs><Spr><Name>TRAXSPR0001</Name>
<DateCreated>11/15/2000</DateCreated>
<State>Open</State>
<TestDesc>SAXTransformerFactoty#FEATURE should document support for all TransformerFactories.</TestDesc><Details><![CDATA[In SAXTransformerFactoty:

    /** If {@link javax.xml.transform.TransformerFactory#getFeature}
     * returns true when passed this value as an argument,
     * the TransformerFactory returned from
     * {@link javax.xml.transform.TransformerFactory#newInstance} may
     * be safely cast to a SAXTransformerFactory.
     */
    public static final String FEATURE =

I propose you remove the phrase "returned from
TransforerFactory.newInstance". Isn't the intent that feature testing
can be done on all TransformerFactories, regardless how they are
created? It can be like this instead:

    /** If {@link javax.xml.transform.TransformerFactory#getFeature}
     * returns true when passed this value as an argument,
     * the TransformerFactory can be safely cast to a
     * SAXTransformerFactory.
     */]]></Details></Spr><Spr><Name>TRAXSPR0002</Name>
<DateCreated>11/15/2000</DateCreated>
<State>Open</State>
<TestDesc>OutputKeys#method should document qname instead of qname-but-not-ncname</TestDesc><Details><![CDATA[In OutputKeys:

    /**
     * method = "xml" | "html" | "text" | <var>qname-but-not-ncname</var>.
     *
     * <p>The method attribute identifies the overall method that
     * should be used for outputting the result tree.  Other
     * non-namespaced values may be used,

This is contradictary, change "qname-but-not-ncname" to "qname".]]></Details></Spr>
<Spr><Name>TRAXSPR0003</Name>
<DateCreated>11/15/2000</DateCreated>
<State>Open</State>
<TestDesc></TestDesc><Details><![CDATA[]]></Details></Spr>
<Spr><Name>TRAXSPR0004</Name>
<DateCreated>11/15/2000</DateCreated>
<State>Open</State>
<TestDesc></TestDesc><Details><![CDATA[]]></Details></Spr>
<Spr><Name>TRAXSPR0005</Name>
<DateCreated>11/15/2000</DateCreated>
<State>Open</State>
<TestDesc></TestDesc><Details><![CDATA[]]></Details></Spr>

</Sprs>
