W3C XML Schema has introduced many different ways of reaching your information modeling goals, and we will try to draw a global picture of the landscape to avoid getting lost! We have to make two key choices: which content model to use, and whether to create new types or to derive them from previously defined types.
Let’s go back over the definition of the content models and try to illustrate the different cases in Table 7-1. It shows the relationship between content model and child text and element nodes.
Table 7-1. Content models
Content model |
Mixed |
Complex |
Simple |
Empty |
---|---|---|---|---|
Child elements |
Yes |
Yes |
No |
No |
Child text |
Yes |
No |
Yes |
No |
W3C XML Schema provides two main ways to define complex types: one
for complex content models and one for simple content models. It also
offers several tricks for piggybacking the definition of mixed and
empty contents on these definitions (through a
mixed
attribute on
a complex type definition for mixed contents, and by omitting the
option to declare elements or assigning a simple content that imposes
a null value for empty contents).
Like
simple
datatypes, complex datatypes can be
either named (i.e., global) or anonymous (i.e., local). Global
definitions must have a name and be a top-level element that is
included directly in the
xs:schema
document element. The global
definitions can then be referenced directly in an element definition
using the element type
attribute; new complex types can be derived from the global
definitions. Local complex types are defined directly
where they are needed in a schema; they are anonymous (i.e., no name
attribute); and they have a local scope.
For simple datatypes, there is no choice: you cannot create new primitive datatypes and we must define them by derivation. For complex datatypes, the situation is the opposite: there are no primitive complex types, and complex types must be created before we can do any derivation. When we create our first complex types, we have the choice of defining new content models from scratch or deriving them by extension or restriction from previously defined complex types. This makes it possible for libraries of complex datatypes to be reused within a schema or between different schemas. As far as validation is concerned, these derivations do not change anything compared to simpler definitions: they allow definition of exactly the same models applying to the same instance documents. On the other hand, some applications might be able to draw conclusions from the chain of derivations.