XML Schema Validation with Abstract Complex Types
This article explains the behavior of an XML schema validator when an
element matches an abstract complex type in an XML Schema Definition
(XSD). It covers the core mechanisms of schema-level abstract
definitions, the requirement for dynamic type substitution using the
xsi:type attribute, and the specific validation rules and
failure conditions applied during the process.
The Purpose of Abstract Complex Types
In XSD, an abstract complex type is declared by setting the attribute
abstract="true" on an xs:complexType
definition. Similar to abstract classes in object-oriented programming,
an abstract complex type acts as a structural baseline and cannot be
used directly to validate an instance element. Its purpose is to force
schema designers and document authors to use derived, concrete types via
extension or restriction.
Validation Without
xsi:type
When an XML processor validates an element whose declared type in the schema is abstract, it immediately inspects the element for an explicit concrete type declaration.
If the instance element does not include an xsi:type
attribute: * The validation process halts for that element. * The
validator throws a schema validation error (typically stating that an
abstract type cannot be directly instantiated). * The document is marked
as invalid.
Validation With
xsi:type (Type Substitution)
To successfully validate an element declared with an abstract type,
the instance document must explicitly declare a concrete derived type
using the xsi:type attribute from the XML Schema Instance
namespace (http://www.w3.org/2001/XMLSchema-instance).
When xsi:type is present, the validator executes the
following checks:
- Type Resolution: The validator resolves the QName
supplied in the
xsi:typeattribute against the known schemas in scope. - Derivation Hierarchy Check: The validator verifies
that the resolved type is a valid derived type (via
<xs:extension>or<xs:restriction>) of the abstract base type assigned to the element. - Abstract Check on Target: The validator confirms
that the substituted type itself is not also marked as
abstract="true". - Blocking Constraints: The validator checks whether
the base type or element declaration contains
blockattributes (such asblock="extension"orblock="#all") that prohibit the specific substitution. - Content Model Validation: If all previous checks
pass, the validator evaluates the element’s child elements, attributes,
and text nodes against the rules and constraints of the concrete derived
type defined by
xsi:type.
If the substituted type fails any of these inheritance, blocking, or structural constraints, the validator raises a schema error and invalidates the document.