<constraintSpec>
constraint on schema
contains a formal constraint, typically expressed in a rule-based schema language, to which a construct must conform in order to be considered valid
Attributes
- @schemesupplies the name of the language in which the constraints are defined
- Status
- Optional
- Datatype
- teidata.enumerated
- Suggested values
schematron- (ISO Schematron)
- @typecharacterizes the constraintSpec element in some sense; used to indicate when a constraintSpec warns about a deprecated construct.
- Status
- Datatype
- teidata.enumerated
- Suggested values
deprecationWarning- Indicates that this constraint specification warns that some other construct in the schema is deprecated.
Classes and content
- Member of
- May contain
tagdocs
- Contained by
cmc
dictionaries
msdescription
namesdates
textstructure
verse
Note
A child constraint is required when the @mode attribute has the value replace or add (or is not specified, as add is the default). No child elements are permitted when the @mode attribute has the value delete. At least one child element is required when the @mode attribute has the value change.
Examples
This constraint uses Schematron to enforce the presence of the @spanTo attribute (which comes from an attribute class) on the addSpan element:
<constraintSpec ident="demo-c1" scheme="schematron">
<desc>Enforce the presence of the <att>spanTo</att> attribute</desc>
<constraint>
<sch:rule context="tei:addSpan">
<sch:assert test="@spanTo">The @spanTo attribute of <<sch:name/>> is required.</sch:assert>
</sch:rule>
</constraint>
</constraintSpec>
<constraintSpec ident="demo-c2" scheme="schematron">
<desc>Implement an accessibility rule which says that pictures
should have textual explanations</desc>
<constraint>
<sch:rule context="tei:figure">
<sch:report test="not( tei:figDesc | tei:head )">You should
provide information in a figure from which
we can construct an @alt attribute in HTML.</sch:report>
</sch:rule>
</constraint>
</constraintSpec>
This constraint uses SPITBOL (a language which is not expressed in XML) to check whether the title and author are identical:
<constraintSpec ident="author_ne_title" scheme="SPITBOL">
<constraint>
(output = leq(title,author) "title and author cannot be the same")</constraint>
</constraintSpec>
Schematron
<constraintSpec xmlns:sch="http://purl.oclc.org/dsdl/schematron" scheme="schematron" ident="empty-based-on-mode" xml:lang="en">
<constraint>
<sch:rule context="tei:constraintSpec[ @mode eq 'delete']">
<sch:report test="child::*">This <constraintSpec> element has a @mode of "delete" even though it has child elements. Change the @mode to "add", "change", or "replace", or remove the child elements.</sch:report>
</sch:rule>
<sch:rule context="tei:constraintSpec[ @mode eq 'change']">
<sch:assert test="child::*">This <constraintSpec> element has a @mode of "change", but does not have any child elements. Specify child elements, or change the @mode to "delete".</sch:assert>
</sch:rule>
<sch:rule context="tei:constraintSpec[ @mode = ('add','replace') ]">
<sch:assert test="child::tei:constraint">This <constraintSpec> element has a @mode of "<sch:value-of select="@mode"/>", but does not have a child 'constraint' element. Use a child 'constraint' element or change the @mode to "delete" or "change".</sch:assert>
</sch:rule>
</constraint>
</constraintSpec><constraintSpec xmlns:sch="http://purl.oclc.org/dsdl/schematron" ident="sch_no_more" scheme="schematron" xml:lang="en">
<desc versionDate="2018-07-06" xml:lang="en">Relationship between scheme attribute and contents: Schematron 1.x</desc>
<constraint>
<sch:rule context="tei:constraintSpec">
<sch:report test="tei:constraint/sch1x:* and @scheme = ('isoschematron','schematron')">Rules
in the Schematron 1.* language must be inside a <constraintSpec>
with a value other than "schematron" or "isoschematron" on the
@scheme attribute.</sch:report>
</sch:rule>
</constraint>
</constraintSpec><constraintSpec xmlns:sch="http://purl.oclc.org/dsdl/schematron" ident="isosch" scheme="schematron" xml:lang="en">
<desc versionDate="2018-07-06" xml:lang="en">Relationship between scheme attribute and contents: ISO Schematron</desc>
<constraint>
<sch:rule context="tei:constraintSpec[ @mode = ('add','replace') or not( @mode ) ]">
<sch:report test="tei:constraint/sch:* and not( @scheme eq 'schematron')">Rules
in the ISO Schematron language must be inside a <constraintSpec>
with the value "schematron" on the @scheme attribute.</sch:report>
</sch:rule>
</constraint>
</constraintSpec><constraintSpec xmlns:sch="http://purl.oclc.org/dsdl/schematron" ident="context-required" scheme="schematron" xml:lang="en">
<constraint>
<sch:rule context="(tei:constraintSpec|tei:constraintDecl)[ @scheme eq 'schematron'][ .//sch:assert | .//sch:report ]">
<sch:let name="assertsHaveContext" value="for $a in .//sch:assert return exists( $a/ancestor::sch:rule/@context )"/>
<sch:let name="reportsHaveContext" value="for $r in .//sch:report return exists( $r/ancestor::sch:rule/@context )"/>
<sch:report test="( $assertsHaveContext, $reportsHaveContext ) = false()">An <sch:assert> or <sch:report>
element must be a descendant of an <sch:rule> that has a @context; one or more inside this
<<sch:value-of select="local-name(.)"/>> are not.</sch:report>
</sch:rule>
</constraint>
</constraintSpec><constraintSpec xmlns:sch="http://purl.oclc.org/dsdl/schematron" ident="unique-constraintSpec-ident" scheme="schematron" xml:lang="en">
<constraint>
<sch:rule context="tei:constraintSpec[ @mode eq 'add' or not( @mode ) ]">
<sch:let name="myIdent" value="normalize-space(@ident)"/>
<sch:report test="preceding::tei:constraintSpec[ normalize-space(@ident) eq $myIdent ]">
The @ident of <constraintSpec> should be unique; this one (<sch:value-of select="$myIdent"/>) is the same as that of a previous <constraintSpec>.
</sch:report>
</sch:rule>
</constraint>
</constraintSpec>Content model
<content>
<sequence>
<alternate minOccurs="0" maxOccurs="unbounded">
<classRef key="model.identSynonyms"/>
<classRef key="model.descLike"/>
</alternate>
<elementRef key="constraint" minOccurs="0" maxOccurs="1"/>
</sequence>
</content>