<elementSpec>

<elementSpec> (element specification) documents the structure, content, and purpose of a single element type. [23.5 Element Specifications 23 Documentation Elements]
Module tagdocs — Documentation Elements
Attributes
prefix⚓︎ specifies a default prefix which will be prepended to all patterns relating to the element, unless otherwise stated.
Status Optional
Datatype 0–1 occurrences of teidata.xmlName separated by whitespace
Member of
Contained by
May contain
Note

elementSpec currently allows valList as a direct child, but this usage is deprecated and will be removed on 2027-09-01. If a valList is used to specify the content model of an element, it should be placed inside the content child of the elementSpec.

Example
<elementSpec module="tagdocsident="code">
 <gloss/>
 <desc>contains literal code</desc>
 <classes>
  <memberOf key="model.emphLike"/>
 </classes>
 <content>
  <textNode/>
 </content>
 <attList>
  <attDef ident="typeusage="opt">
   <desc>the language of the code</desc>
   <datatype>
    <dataRef key="teidata.enumerated"/>
   </datatype>
  </attDef>
 </attList>
</elementSpec>
Schematron

<sch:rule context="tei:elementSpec[ @mode eq 'delete' ]">
<sch:report test="child::*">This <elementSpec> 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:elementSpec[ @mode = ('add','change','replace') ]">
<sch:assert test="child::* | (@* except (@mode, @ident))">This <elementSpec> element has a @mode of "<sch:value-of select="@mode"/>", but does not have any child elements or schema-changing attributes. Specify child elements, use validUntil=, predeclare=, ns=, or prefix=, or change the @mode to "delete".</sch:assert>
</sch:rule>
Schematron

<sch:rule context="tei:elementSpec/tei:valList">
<sch:report test="true()"> Use of <valList> as a direct child of <elementSpec> is deprecated
and will be invalid after 2027-08-31. To express a controlled vocabulary
as the content model of an element, place the <valList> inside a
<content> element.
</sch:report>
</sch:rule>
Content model
<content>
 <sequence>
  <alternate minOccurs="0"
   maxOccurs="unbounded">

   <classRef key="model.identSynonyms"/>
   <classRef key="model.descLike"/>
  </alternate>
  <elementRef key="classesminOccurs="0"/>
  <elementRef key="contentminOccurs="0"/>
  <elementRef key="valListminOccurs="0"/>
  <elementRef key="constraintSpec"
   minOccurs="0maxOccurs="unbounded"/>

  <elementRef key="attListminOccurs="0"/>
  <alternate maxOccurs="unbounded"
   minOccurs="0">

   <elementRef key="model"/>
   <elementRef key="modelGrp"/>
   <elementRef key="modelSequence"/>
  </alternate>
  <elementRef key="exemplumminOccurs="0"
   maxOccurs="unbounded"/>

  <elementRef key="remarksminOccurs="0"
   maxOccurs="unbounded"/>

  <elementRef key="listRefminOccurs="0"
   maxOccurs="unbounded"/>

 </sequence>
</content>
Schema Declaration
<rng:element name="elementSpec">
 <rng:ref name="att.global.attributes"/>
 <rng:ref name="att.global.analytic.attributes"/>
 <rng:ref name="att.global.change.attributes"/>
 <rng:ref name="att.global.facs.attributes"/>
 <rng:ref name="att.global.linking.attributes"/>
 <rng:ref name="att.global.rendition.attributes"/>
 <rng:ref name="att.global.responsibility.attributes"/>
 <rng:ref name="att.global.source.attributes"/>
 <rng:ref name="att.identified.attributes"/>
 <rng:ref name="att.combinable.attributes"/>
 <rng:ref name="att.deprecated.attributes"/>
 <rng:ref name="att.namespaceable.attributes"/>
 <rng:optional>
  <rng:attribute name="prefix">
   <rng:optional>
    <rng:ref name="teidata.xmlName"/>
   </rng:optional>
  </rng:attribute>
 </rng:optional>
 <rng:group>
  <rng:zeroOrMore>
   <rng:choice>
    <rng:ref name="model.identSynonyms"/>
    <rng:ref name="model.descLike"/>
   </rng:choice>
  </rng:zeroOrMore>
  <rng:optional>
   <rng:ref name="classes"/>
  </rng:optional>
  <rng:optional>
   <rng:ref name="content"/>
  </rng:optional>
  <rng:optional>
   <rng:ref name="valList"/>
  </rng:optional>
  <rng:zeroOrMore>
   <rng:ref name="constraintSpec"/>
  </rng:zeroOrMore>
  <rng:optional>
   <rng:ref name="attList"/>
  </rng:optional>
  <rng:zeroOrMore>
   <rng:choice>
    <rng:ref name="model"/>
    <rng:ref name="modelGrp"/>
    <rng:ref name="modelSequence"/>
   </rng:choice>
  </rng:zeroOrMore>
  <rng:zeroOrMore>
   <rng:ref name="exemplum"/>
  </rng:zeroOrMore>
  <rng:zeroOrMore>
   <rng:ref name="remarks"/>
  </rng:zeroOrMore>
  <rng:zeroOrMore>
   <rng:ref name="listRef"/>
  </rng:zeroOrMore>
 </rng:group>
</rng:element>
element elementSpec
{
   att.global.attributes,
   att.global.analytic.attributes,
   att.global.change.attributes,
   att.global.facs.attributes,
   att.global.linking.attributes,
   att.global.rendition.attributes,
   att.global.responsibility.attributes,
   att.global.source.attributes,
   att.identified.attributes,
   att.combinable.attributes,
   att.deprecated.attributes,
   att.namespaceable.attributes,
   attribute prefix { teidata.xmlName? }?,
   (
      ( model.identSynonyms | model.descLike )*,
      classes?,
      content?,
      valList?,
      constraintSpec*,
      attList?,
      ( model | modelGrp | modelSequence )*,
      exemplum*,
      remarks*,
      listRef*
   )
}