Compatibility requirements for evolving an XML schema
The process of evolving an XML schema in the XML schema repository (XSR) requires that both the original XML schema and the new one used to update it are sufficiently alike.
In cases where the two XML schemas are not compatible, the update will fail and an error message is generated. The following ten compatibility criteria must be met for the update process to proceed. Examples are shown of schemas that would not meet the described requirement.
- Attribute content
- Attributes declared or referenced inside of a complex type in
the original XML schema must also be present in the new XML schema.
Also, required attributes cannot be present in the new XML schema
if they are not included in the original XML schema.
- Example 1
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:attribute name="a" type="xs:string"/> <xs:attribute name="b" use="optional" type="xs:string"/> </xs:complexType> </xs:element> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:attribute name="a" type="xs:string"/> </xs:complexType> </xs:element> </xs:schema>
- Example 2
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:attribute name="a" type="xs:string"/> </xs:complexType> </xs:element> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:attribute name="a" type="xs:string"/> <xs:attribute name="b" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:schema>
- Element content
- Elements declared or referenced inside of a complex type in the
original XML schema must be present in the new XML schema. Required
elements cannot be present in the new XML schema if they are not included
in the original XML schema; only optional elements may be added.
- Example 1
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="a" type="xs:string"/> <xs:element name="b" minOccurs="0" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="a" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
- Example 2
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="a" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="a" type="xs:string"/> <xs:element name="b" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
- Example 3
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="a" type="xs:string"/> <xs:element name="b" substitutionGroup="a"/> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element ref="a"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="a" type="xs:string"/> <xs:element name="b" type="xs:string"/> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element ref="a"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
- Facet conflict
- The facet value for a simple type in the new XML schema must be
compatible with the range of values for the simple type defined in
the original XML schema.
- Example 1
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="foo" > <xs:simpleType> <xs:restriction base="xs:decimal" /> </xs:simpleType> </xs:element> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="foo"> <xs:simpleType> <xs:restriction base="xs:decimal"> <xs:totalDigits value="7"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:schema>
- Example 2
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="foo"> <xs:simpleType> <xs:restriction base="xs:decimal"> <xs:totalDigits value="7"/> <xs:fractionDigits value="3"/> <xs:maxInclusive value="300.00"/> <xs:minInclusive value="1.0"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="foo"> <xs:simpleType> <xs:restriction base="xs:decimal"> <xs:totalDigits value="5"/> <xs:fractionDigits value="2"/> <xs:pattern value="(0|1|2|3|4|5|6|7|8|9|\.)*"/> <xs:maxInclusive value="100.00"/> <xs:minInclusive value="10.00"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:schema>
- Incompatible type
- The type of an element or attribute in the new XML schema is not
compatible if already inserted
XML documents would fail validation against the new schema, or if
the schema includes a simple type annotation that differs from that
in the original XML schema.
- Example
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="a" type="xs:string"/> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="a" type="xs:integer"/> </xs:schema>
- Mixed into not mixed content
- If the content model of a complex type is declared as mixed in
the original XML schema, it must not be declared as not mixed in the
new XML schema.
- Example
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:complexContent mixed="true"> <xs:restriction base="xs:anyType"> <xs:attribute name="a" type="xs:string"/> </xs:restriction> </xs:complexContent> </xs:complexType> </xs:element> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:complexContent mixed="false"> <xs:restriction base="xs:anyType"> <xs:attribute name="a" type="xs:string"/> </xs:restriction> </xs:complexContent> </xs:complexType> </xs:element> </xs:schema>
- Nillable into not nillable
- If the nillable attribute in an element declaration of the original
XML schema is turned on, it must also be turned on in the new XML
schema.
- Example
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="a" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="a" nillable="false" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
- Removed element
- Global elements declared in the original XML schema must also
be present in the new XML schema, and must not be made abstract.
- Example 1
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="a" type="xs:string"/> <xs:element name="b" type="xs:string"/> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="a" type="xs:string"/> </xs:schema>
- Example 2
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="a" type="xs:string"/> <xs:element name="b" type="xs:string"/> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="a" type="xs:string"/> <xs:element name="b" abstract="true" type="xs:string"/> </xs:schema>
- Removed type
- If the original XML schema contains a global type that is derived
from another type, the global type must also be present in the new
XML schema.
- Example
Original XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root" type="t1"/> <xs:complexType name="t1"> <xs:complexContent> <xs:extension base="xs:anyType"> <xs:attribute name="a" use="required"/> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="t2"> <xs:complexContent> <xs:extension base="t1"> <xs:attribute name="b" use="required"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root" type="t1"/> <xs:complexType name="t1"> <xs:complexContent> <xs:extension base="xs:anyType"> <xs:attribute name="a" use="required"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:schema>
- Simple to complex
- A complex type that contains simple content in the original XML
schema cannot be redefined to contain complex content in the updated
XML schema.
- Example
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="a" type="xs:string"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:complexContent base="xs:anyType"> <xs:extension base="xs:anyType"> <xs:attribute name="a" type="xs:string"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> </xs:schema>
- Simple content
- Simple types defined in the original XML schema and in the new
XML schema must share the same base types.
- Example
- Original XML schema:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="foo" > <xs:simpleType> <xs:restriction base="xs:decimal" /> </xs:simpleType> </xs:element> </xs:schema>
New XML schema:<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="foo" > <xs:simpleType> <xs:restriction base="xs:string" /> </xs:simpleType> </xs:element> </xs:schema>