Skip to content

<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

Module tagdocsTDTAG

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
Contained by

cmc

linking

namesdates

spoken

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 &lt;<sch:name/>&gt; 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 &lt;constraintSpec&gt; 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 &lt;constraintSpec&gt; 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 &lt;constraintSpec&gt; 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 &lt;constraintSpec&gt;
        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 &lt;constraintSpec&gt;
          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 &lt;sch:assert&gt; or &lt;sch:report&gt;
          element must be a descendant of an &lt;sch:rule&gt; that has a @context; one or more inside this
          &lt;<sch:value-of select="local-name(.)"/>&gt; 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 &lt;constraintSpec&gt; should be unique; this one (<sch:value-of select="$myIdent"/>) is the same as that of a previous &lt;constraintSpec&gt;.
        </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>