There are certain rules that apply to the design and implementation of constraints.
@domains
attributeEach constraint that is integrated into a DITA document type MUST be declared in the @domains
attribute for each
structural type that is integrated into the document type.
For DTDs, the contribution for the @domains
attribute is specified in the constraint module file; for XSD and RELAX NG, the contribution
to the @domains
attribute is specified directly in the document type
shell.
The content model for a constrained element must be at least as restrictive as the unconstrained content model for the element.
The content model and attributes of an element can be constrained by only one constraint module. If two constraint modules exist that constrain the content model or attributes for a specific element, those two modules must be replaced with a new constraint module that reflects the aggregation of the two original constraint modules.
When a domain module is integrated into a document-type shell, the base domain element can be omitted from the domain extension group or parameter entity. In such a case, there is no separate constraint declaration, because the content model is configured directly in the document-type shell.
A domain module can be constrained by only one constraint module. This means that all restrictions for the extension elements that are defined in the domain must be contained within that one constraint module.
Each constraint module can constrain elements from only one
vocabulary module. For example, a single constraint module that constrains
<refsyn>
from reference.mod and constrains
<context>
from task.mod is not allowed.
This rule maintains granularity of reuse at the module level.
Constraint modules that restrict different elements from within the same vocabulary module can be combined with one another. Such combinations of constraints on a single vocabulary module have no meaningful order or precedence.