//
// Copyright (c) 2020 Contributors to the Eclipse Foundation
//

[appendix]
== XML Schema

=== Abstract Schema Model

The following summarization abstract schema
component model has been extracted from [XSD Part 1] as a convenience
for those not familiar with XML Schema component model in understanding
the binding of XML Schema components to Java representation. One must
refer to [XSD Part 1] for the complete normative description for these
components.

==== Simple Type Definition Schema Component

.Simple Type Definition Schema Components
[cols=",,",options="header"]
|===
| Component 2+| Description
| `{name}` 2+| Optional. An NCName as defined by [XML-Namespaces].
| `{target namespace}` 2+| Either ·absent· or a namespace name.
| `{base type definition}` 2+| A simple type definition
| `{facets}` 2+| A set of constraining facets.
| `{fundamental facets}` 2+| A set of fundamental facets.
| `{final}` 2+| A subset of {extension, list, restriction, union}.
| `{variety}` 2+| One of {atomic, list, union}. Depending on
the value of {variety}, further properties are defined as follows:
| | atomic

`{primitive type definition}` | A built-in primitive simple type definition.
| | list

`{item type definition}` | A simple type definition.
| | union

`{member type definitions}` |A non-empty sequence of simple type definitions.

| `{annotation}` 2+| Optional. An annotation.
|===

==== Enumeration Facet Schema Component

.Enumeration Facet Schema Components
[cols=",",options="header"]
|===
| Component | Description
| `{value}` | The actual value of the value. (Must be in
value space of base type definition.)
| `{annotation}` | Optional annotation.
|===

==== Complex Type Definition Schema Component

.Complex Type Definition Schema Components
[cols=",",options="header"]
|===
| Component | Description
| `{name}` | Optional. An NCName as defined by [XML-Namespaces].
| `{target namespace}` | Either `absent` or a namespace name.
| `{base type definition}` | Either a simple type definition or a complex type definition.
| `{scope}` | Either _global_ or a complex type definition
| `{derivation method}` | Either extension or _restriction_.
| `{final}` | A subset of {extension, restriction}.
| `{abstract}` | A boolean
| `{attribute uses}` | A set of attribute uses.
| `{attribute wildcard}` | Optional. A wildcard.
| `{content type}` | One of _empty_, a _simple type definition_, or a
pair consisting of a `content model` and one of _mixed_, _element-only_.
| `{prohibited substitutions}` | A subset of {extension, restriction}.
| `{substitution group affiliation}` | Optional. If exists, this element declaration
belongs to a substitution group and this specified element name is the
QName of the substitution head.
| `{annotations}` | A set of annotations.
|===

==== Element Declaration Schema Component

.Element Declaration Schema Components
[cols=",",options="header"]
|===
| Component | Description
| `{name}` | An NCName as defined by [XML-Namespaces].
| `{target namespace}` | Either ·absent· or a namespace name
| `{type definition}` | Either a simple type definition or a complex type definition.
| `{scope}` | Optional. Either global or a complex type definition.
| `{value constraint}` | Optional. A pair consisting of a value and one of default, fixed.
| `{nillable}` | A boolean.
| `{identity-constraint definitions}` | A set of constraint definitions.
| `{substitution group affiliation}` | Optional. A top-level element definition.
| `{substitution group exclusions}` | A subset of {extension, restriction}.
| `{disallowed substitution}` | A subset of {substitution,extension,restriction}.
| `{abstract}` | A boolean.
| `{annotation}` | Optional. An annotation.
|===

==== Attribute Declaration Schema Component

.Attribute Declaration Schema Components
[cols=",",options="header"]
|===
| Component | Description
| `{name}` | An NCName as defined by [XML-Namespaces].
| `{target namespace}` | If form is present and is "qualified", or if
form is absent and the value of @attributeFormDefault on the <schema>
ancestor is "qualified", then the schema’s {targetNamespace}, or
`absent` if there is none, otherwise `absent`
| `{type definition}` | A simple type definition.
| `{scope}` | Optional. Either global or a complex type definition.
| `{value constraint}` | Optional. A pair consisting of a value and
one of default, fixed.
| `{annotation}` | Optional. An annotation.
|===

==== Model Group Definition Schema Component

.Model Group Definition Schema Components
[cols=",",options="header"]
|===
| Component | Description
| `{name}` | An NCName as defined by [XML-Namespaces].
| `{target namespace}` | Either `absent` or a namespace name.
| `{model group}` | A model group.
| `{annotation}` | Optional. An annotation.
|===

==== Identity-constraint Definition Schema Component

.Identity-constraint Definition Schema Components
[cols=",",options="header"]
|===
| Component | Description
| `{name}` | An NCName as defined by [XML-Namespaces].
| `{target namespace}` | Either ·absent· or a namespace name.
| `{identity-constraint category}` | One of key, keyref or unique.
| `{selector}` | A restricted XPath ([XPath]) expression.
| `{fields}` | A non-empty list of restricted XPath ([XPath]) expressions.
| `{referenced key}` | Required if \identity-constraint category}
is keyref, forbidden otherwise.

An identity-constraint definition with
{identity-constraint category} equal to key or unique.

| `{annotation}` | Optional. An annotation.
|===

==== Attribute Use Schema Component

.Attribute Use Schema Components
[cols=",",options="header"]
|===
| Component | Description
| `{required}` | A boolean.
| `{attribute declaration}` | An attribute declaration.
| `{value constraint}` | Optional. A pair consisting of a value and
one of default, fixed.
|===

==== Particle Schema Component

.Particle Schema Components
[cols=",",options="header"]
|===
| Component | Description
| `{min occurs}` | A non-negative integer.
| `{max occurs}` | Either a non-negative integer or unbounded.
| `{term}` | One of a model group, a wildcard, or an element declaration.
|===

==== Wildcard Schema Component

.Wildcard Schema Components
[cols=",",options="header"]
|===
| Component | Description
| `{namespace constraint}` | One of any; a pair of not and a namespace
name or `absent`; or a set whose members are either namespace names or
`absent`.
| `{process contents}` | One of `skip`, `lax` or `strict`.
| `{annotation}` | Optional. An annotation.
|===

==== Model Group Schema Component

.Model Group Components
[cols=",",options="header"]
|===
| Component | Description
| `{compositor}` | One of _all, choice_ or _sequence_.
| `{particles}` | A list of particles.
| `{annotation}` | An annotation.
|===

==== Notation Declaration Schema Component

.Notation Declaration Components
[cols=",",options="header"]
|===
| Component | Description
| `{name}` | An NCName as defined by [XML-Namespaces].
| `{target namespace}` | Actual value of the targetNamespace
[attribute] of the parent schema element
| `{system identifier}` | The ·actual value· of the system [attribute],
if present, otherwise absent.
| `{public identifier}` | The ·actual value· of the public [attribute]
| `{annotation}` | Optional. An annotation.
|===

==== Wildcard Schema Component

.Wildcard Components
[cols=",",options="header"]
|===
| Component | Description
| `{namespace constraint}` | One of `any`; a pair of `no` and a
namespace name or `absent`; or a set whose members are either namespace
names or `absent`.
| `{process contents}` | One of `skip`, `lax` or `strict`.
| `{annotation}` | Optional. An annotation.
|===

==== Attribute Group Definition Schema Component

.Attribute Group Definition Schema Components
[cols=",",options="header"]
|===
| Component | Description
| `{name}` | An NCName as defined by [XML-Namespaces].
| `{target namespace}` | Either `absent` or a namespace name.
| `{attribute uses}` | A set of attribute uses.
| `{attribute wildcard}` | Optional. A wildcard. _(part of the complete wildcard)_
| `{annotation}` | Optional. An annotation.
|===
