<msDesc>

<msDesc> (manuscript description) contains a description of a single identifiable manuscript or other text-bearing object such as an early printed book. [10.1 Overview]
Module msdescription — Manuscript Description
Attributes
Member of
Contained by
May contain
Note

Although the msDesc has primarily been designed with a view to encoding manuscript descriptions, it may also be used for other objects such as early printed books, fascicles, epigraphs, or any text-bearing objects that require substantial description. If an object is not text-bearing or the reasons for describing the object is not primarily the textual content, the more general object may be more suitable.

Example
<msDesc>
 <msIdentifier>
  <settlement>Oxford</settlement>
  <repository>Bodleian Library</repository>
  <idno type="Bod">MS Poet. Rawl. D. 169.</idno>
 </msIdentifier>
 <msContents>
  <msItem>
   <author>Geoffrey Chaucer</author>
   <title>The Canterbury Tales</title>
  </msItem>
 </msContents>
 <physDesc>
  <objectDesc>
   <p>A parchment codex of 136 folios, measuring approx
       28 by 19 inches, and containing 24 quires.</p>
   <p>The pages are margined and ruled throughout.</p>
   <p>Four hands have been identified in the manuscript: the first 44
       folios being written in two cursive anglicana scripts, while the
       remainder is for the most part in a mixed secretary hand.</p>
  </objectDesc>
 </physDesc>
</msDesc>
Schematron

<sch:rule context="tei:msContents|tei:physDesc|tei:history|tei:additional">

<!-- Note: This rule applies to <msContents>, <physDesc>, <history>, and <additional> wherever they occur. Luckily they are only allowed in places where they are constrained to 0 or 1 occurence. If that changes someday, this constraint may will likely need to be updated, too. -->

<!-- Also worth noting that a) if &amp; when we can use abstract patterns, this would be better handled as a single abstract rule somewhere, and concrete rules in the individual <elementSpec>s; and b) I did not test for the existence of "../*[name(.) eq $gi][2]" because then an error would be generated for each of the multiple occurences of $gi. -->
<sch:let name="givalue="name(.)"/>
<sch:report test="preceding-sibling::*[ name(.) eq $gi ] and not( following-sibling::*[ name(.) eq $gi ] )"> Only one <sch:name/> is allowed as a child of <sch:value-of select="name(..)"/>.
</sch:report>
</sch:rule>
Content model
<content>
 <sequence>
  <elementRef key="msIdentifier"/>
  <classRef key="model.headLike"
   minOccurs="0maxOccurs="unbounded"/>

  <alternate>
   <classRef key="model.pLike"
    minOccurs="1maxOccurs="unbounded"/>

   <alternate minOccurs="0"
    maxOccurs="unbounded">

    <elementRef key="msContents"/>
    <elementRef key="physDesc"/>
    <elementRef key="history"/>
    <elementRef key="additional"/>
    <elementRef key="msPart"/>
    <elementRef key="msFrag"/>
   </alternate>
  </alternate>
 </sequence>
</content>
Schema Declaration
<rng:element name="msDesc">
 <rng:ref name="att.global.attributes"/>
 <rng:ref name="att.global.rendition.attributes"/>
 <rng:ref name="att.global.linking.attributes"/>
 <rng:ref name="att.global.analytic.attributes"/>
 <rng:ref name="att.global.facs.attributes"/>
 <rng:ref name="att.global.change.attributes"/>
 <rng:ref name="att.global.responsibility.attributes"/>
 <rng:ref name="att.global.source.attributes"/>
 <rng:ref name="att.sortable.attributes"/>
 <rng:ref name="att.typed.attributes"/>
 <rng:ref name="att.declaring.attributes"/>
 <rng:ref name="att.docStatus.attributes"/>
 <rng:group>
  <rng:ref name="msIdentifier"/>
  <rng:zeroOrMore>
   <rng:ref name="model.headLike"/>
  </rng:zeroOrMore>
  <rng:choice>
   <rng:oneOrMore>
    <rng:ref name="model.pLike"/>
   </rng:oneOrMore>
   <rng:zeroOrMore>
    <rng:choice>
     <rng:ref name="msContents"/>
     <rng:ref name="physDesc"/>
     <rng:ref name="history"/>
     <rng:ref name="additional"/>
     <rng:ref name="msPart"/>
     <rng:ref name="msFrag"/>
    </rng:choice>
   </rng:zeroOrMore>
  </rng:choice>
 </rng:group>
</rng:element>
element msDesc
{
   att.global.attributes,
   att.global.rendition.attributes,
   att.global.linking.attributes,
   att.global.analytic.attributes,
   att.global.facs.attributes,
   att.global.change.attributes,
   att.global.responsibility.attributes,
   att.global.source.attributes,
   att.sortable.attributes,
   att.typed.attributes,
   att.declaring.attributes,
   att.docStatus.attributes,
   (
      msIdentifier,
      model.headLike*,
      (
         model.pLike+
       | ( msContents | physDesc | history | additional | msPart | msFrag )*
      )
   )
}