<?xml version='1.0' encoding='UTF-8'?>
<!--
 * 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.
-->
<!DOCTYPE s1 SYSTEM 'dtd/document.dtd'>
<s1 title="XML Schema">
    <s2 title="Introduction">
        <p>This package contains an implementation of the W3C XML 
        Schema 1.0 Language, a recommendation of the Worldwide Web Consortium
        available in three parts:  
        <jump href="http://www.w3.org/TR/XMLSchema-0">XML Schema:  Primer</jump>  and
        <jump href="http://www.w3.org/TR/XMLSchema-1">XML Schema:  Structures</jump>  and
        <jump href="http://www.w3.org/TR/XMLSchema-2">XML Schema:  Datatypes</jump>. 
        We consider this implementation to be complete except for the
        limitations cited below.  The implementation has been
        extensively tested and known problem areas are set out below.
        This package also contains a partial experimental implementation 
        of the XML Schema 1.1
        <jump href='http://www.w3.org/TR/2009/WD-xmlschema11-1-20091203/'>Structures</jump> and
        <jump href='http://www.w3.org/TR/2009/WD-xmlschema11-2-20091203/'>Datatypes</jump>
        Working Drafts (December 2009). The XML Schema 1.1 features supported by this
        release are listed below.
        In this document we also discuss our interpretation of the
        specifications where it seems to us particularly likely that
        others might arrive at a different interpretation.
        Please read this document before using this package.
        </p>
    </s2>

<s2 title="XML Schema Programmer's Guide">
<p>This section provides the following topics:</p>

<ul>
<li><jump href='#supported-schema-1.1-features'>Supported XML Schema 1.1 Features</jump></li>
<li><jump href='#schema-limitations'>Limitations and known bugs</jump></li>
<li><link idref='faq-xs'>How do I?</link> -- 
    the most frequently asked questions
    about XML Schema that include some sample code.</li>
</ul>
</s2>
<anchor name="supported-schema-1.1-features"/>
    <s2 title="Supported XML Schema 1.1 Features">
        <ul>
           <li>All Groups</li>
           <ul>
              <li>maxOccurs may now be >1</li>
              <li>Wildcards are now allowed</li>
              <li>Derivation by extension</li>
              <li>xs:group is allowed as a child of xs:all</li>
           </ul>
           <li>Assertions</li>
           <li>Conditional Type Assignment</li>
           <li>Simplified Complex Type restriction rules (also known as Subsumption)</li>
           <li>Open Content and Default Open Content</li>
           <li>Default attribute group</li>
           <li>Target namespace on local element/attribute declarations</li>
           <li>Element declarations allowed in more than one substitution group</li>
           <li>Wildcards</li>
           <ul>
              <li>not namespace</li>
              <li>not QName</li>
              <li>not #defined</li>
              <li>not #definedSibling</li>
              <li>Relaxation of UPA in the presence of wildcards</li>
           </ul>
           <li>Overriding component definitions (xs:override)</li>
           <li>Conditional Inclusion</li>
           <ul>
              <li>vc:minVersion</li>
              <li>vc:maxVersion</li>
              <li>vc:typeAvailable</li>
              <li>vc:typeUnavailable</li>
              <li>vc:facetAvailable</li>
              <li>vc:facetUnavailable</li>
           </ul>
           <li>Context property for local simple/complex type definitions</li>
           <li>explicitTimezone facet and dateTimeStamp derived type</li>
           <li>yearMonthDuration and dayTimeDuration derived types</li>
           <li>precisionDecimal type</li>
           <li>Union types not expanded</li>
           <li>ID/IDREF</li>
           <ul>
              <li>Lists of ID</li>
              <li>Unions involving ID</li>
              <li>Multiple attributes of type ID</li>
              <li>Default values of type IDREF</li>
              <li>Default values for elements or attributes of type ID</li>
           </ul>
        </ul>
    </s2>
<anchor name='schema-limitations'/>
    <s2 title="Limitations">
        <ul>
            <li> Length, minLength, and maxLength facets are limited to the value 
            2147483647. Items larger than this limit will not be validated 
            correctly.</li>
            <li> The values of minOccurs and maxOccurs attributes are limited to
            the value 2147483647. Items larger than this limit will not be
            validated correctly.</li>
            <li> The values of minimum and maximum quantifiers in the pattern
            regular expressions are limited to the value 2147483647.
            Items larger than this limit will not be validated correctly.</li>
            <li> The absolute values of the fraction portion of the second values
            in date/time datatypes are limited to the value 2147483647.
            Items larger than this limit will not be validated correctly.
            i.e. 11.2147483648 is not supported as a second value. </li>
            <li> Leap seconds are not supported in the values of date/time datatypes.</li>
        </ul>
    </s2>
    <s2 title='Problem Areas/Known Bugs'>
        <ul>
            <li> For larger values of maxOccurs, an OutOfMemoryError may occur.
            The workaround for this problem, if your application permits it, 
            is to change the maxOccurs value to unbounded. If you are unable to
            change the schema you can configure Xerces-J so that it fails more
            gracefully by enabling the JAXP secure processing feature. See the
            Javadoc for javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING for
            more details.
            </li>
        </ul>
    </s2>
    <s2 title="Other Notes">
      <ul>
        <li> As of version 2.2.1, it is hoped that Xerces-J will always 
        be able to parse the Schema for Schemas current at the time of the product's release.  As of version
        2.2.1, this implies inserting special logic to permit the presence of
        the built-in Schema datatypes in this particular schema; an
        issue has been raised with the Schema Working Group, in hopes the document
        will be modified so that the built-in types are no
        longer presented as global components.  Thus, anyone planning
        to rely on the Schema for Schemas should be aware that the
        possibility exists that a change of this sort might be made in the future.</li>
        <li> In the original XML Schema recommendation, the lexical space of
        the simple type <code>gMonth</code> is <code>--MM--</code>. An erratum E2-12
        changed that to <code>--MM</code>. For compatibility reasons, Xerces currently
        supports both forms. To align with the recommendation, we have decided to
        deprecate the old form, and plan to discontinue support for that form
        in a future release. </li>
      </ul>
    </s2>
</s1>
