namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
namespace ns1 = "http://www.isocat.org/ns/dcr"
default namespace ns2 = "http://www.tei-c.org/ns/1.0"
namespace rng = "http://relaxng.org/ns/structure/1.0"
namespace s = "http://www.ascc.net/xml/schematron"
namespace sch = "http://purl.oclc.org/dsdl/schematron"
namespace teix = "http://www.tei-c.org/ns/Examples"
namespace xi = "http://www.w3.org/2001/XInclude"
namespace xlink = "http://www.w3.org/1999/xlink"

# Schema generated from ODD source 2015-02-18T12:13:54Z. .
# TEI Edition: Version 2.7.0. Last updated on
#	16th September 2014, revision 13036
# TEI Edition Location: http://www.tei-c.org/Vault/P5/Version 2.7.0/
#

# This material is dual-licensed.
# [http://creativecommons.org/licenses/by-sa/3.0/] Distributed under a Creative Commons Attribution-ShareAlike 3.0 Unported License [http://www.opensource.org/licenses/BSD-2-Clause] Copyright 2013 TEI Consortium.All rights reserved.Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.This software is provided by the copyright holders and contributors "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright holder or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.TEI material can be licensed differently depending on the use you intend to make of it. Hence it is made available under both the CC+BY and BSD-2 licences. The CC+BY licence is generally appropriate for usages which treat TEI content as data or documentation. The BSD-2 licence is generally appropriate for usage of TEI content in a software environment. For further information or clarification, please contact the TEI Consortium.
div {
  extrapattern = anyDoc?, pattern, anyDoc?
  pattern =
    element rng:element {
      attribute name { xsd:QName },
      extrapattern+,
      attribute ns { xsd:anyURI }?
    }
    | element rng:element {
        element rng:choice {
          attribute xml:base { xsd:anyURI }?,
          nameClass+
        },
        attribute ns { xsd:anyURI }?,
        extrapattern+
      }
    | element rng:element { nameClass, extrapattern+ }
    | element rng:attribute {
        attribute name { xsd:QName },
        attribute ns { xsd:anyURI }?,
        anyAttDoc?,
        extrapattern?
      }
    | element rng:attribute { nameClass, extrapattern? }
    | element rng:group { extrapattern+ }
    | element rng:interleave { extrapattern+ }
    | element rng:choice { extrapattern+ }
    | element rng:optional { extrapattern+ }
    | element rng:zeroOrMore { extrapattern+ }
    | element rng:oneOrMore { extrapattern+ }
    | element rng:list { extrapattern+ }
    | element rng:mixed { extrapattern+ }
    | element rng:ref {
        attribute name { xsd:NCName }
      }
    | element rng:parentRef {
        attribute name { xsd:NCName }
      }
    | element rng:empty { empty }
    | element rng:text { empty }
    | element rng:value {
        attribute type { xsd:NCName }?,
        xsd:string
      }
    | element rng:data {
        attribute type { xsd:NCName },
        param*,
        exceptExtrapattern?
      }
    | element rng:notAllowed { empty }
    | element rng:externalRef {
        attribute href { xsd:anyURI },
        empty
      }
    | element rng:grammar {
        attribute datatypeLibrary { xsd:anyURI }?,
        attribute ns { xsd:anyURI },
        grammarContent*
      }
  anyDoc =
    element a:* {
      attribute ns { xsd:anyURI }?,
      (anyDoc | text)*
    }
  anyAttDoc = attribute a:defaultValue { text }
  param =
    element rng:param {
      attribute name { xsd:NCName },
      xsd:string
    }
  exceptExtrapattern = element rng:except { extrapattern+ }
  grammarContent =
    \start
    | define
    | element rng:div { grammarContent* }
    | element rng:include {
        attribute href { xsd:anyURI },
        includeContent*
      }
  includeContent =
    \start
    | define
    | element rng:div { includeContent* }
  \start =
    element rng:start {
      attribute combine { method }?,
      extrapattern
    }
  define =
    element rng:define {
      attribute name { xsd:NCName },
      attribute combine { method }?,
      extrapattern+
    }
  method = "choice" | "interleave"
  nameClass =
    element rng:name {
      xsd:QName,
      attribute ns { xsd:anyURI }?
    }
    | element rng:anyName { exceptNameClass? }
    | element rng:nsName {
        attribute ns { xsd:anyURI }?,
        exceptNameClass?
      }
    | element rng:choice { nameClass+ }
  exceptNameClass = element rng:except { nameClass+ }
}
macro.paraContent =
  (text | model.gLike | model.phrase | model.inter | model.global | lg)*
macro.limitedContent = (text | model.limitedPhrase | model.inter)*
macro.phraseSeq = (text | model.gLike | model.phrase | model.global)*
macro.phraseSeq.limited = (text | model.limitedPhrase | model.global)*
macro.specialPara =
  (text
   | model.gLike
   | model.phrase
   | model.inter
   | model.divPart
   | model.global)*
macro.xtext = (text | model.gLike)*
data.certainty = "high" | "medium" | "low" | "unknown"
data.probability = xsd:double { minInclusive = "0" maxInclusive = "1" }
data.numeric =
  xsd:double
  | xsd:token { pattern = "(\-?[\d]+/\-?[\d]+)" }
  | xsd:decimal
data.interval =
  xsd:float { minExclusive = "0" }
  | "regular"
  | "irregular"
  | "unknown"
data.count = xsd:nonNegativeInteger
data.temporal.w3c =
  xsd:date
  | xsd:gYear
  | xsd:gMonth
  | xsd:gDay
  | xsd:gYearMonth
  | xsd:gMonthDay
  | xsd:time
  | xsd:dateTime
data.truthValue = xsd:boolean
data.xTruthValue = xsd:boolean | "unknown" | "inapplicable"
data.language = xsd:language | ""
data.namespace = xsd:anyURI
data.outputMeasurement =
  xsd:token {
    pattern =
      "[\-+]?\d+(\.\d+)?(%|cm|mm|in|pt|pc|px|em|ex|gd|rem|vw|vh|vm)"
  }
data.pattern = xsd:token
data.pointer = xsd:anyURI
data.version = xsd:token { pattern = "[\d]+(\.[\d]+){0,2}" }
data.versionNumber =
  xsd:token { pattern = "[\d]+[a-z]*[\d]*(\.[\d]+[a-z]*[\d]*){0,3}" }
data.replacement = text
data.word = xsd:token { pattern = "(\p{L}|\p{N}|\p{P}|\p{S})+" }
data.text = xsd:string
data.name = xsd:Name
data.xmlName = xsd:NCName
data.enumerated = data.name
macro.anyXML =
  element * - (ns2:* | teix:egXML) {
    attribute * { text }*,
    (text | macro.anyXML)*
  }
macro.schemaPattern =
  (text | (pattern | define)+)
  | anySchematron*
anySchematron =
  element s:* {
    (attribute * { text }
     | anySchematron
     | text)*
  }
att.ascribed.attributes = att.ascribed.attribute.who
att.ascribed.attribute.who =
  
  ## indicates the person, or group of people, to whom the element content is ascribed.
  attribute who {
    list { data.pointer+ }
  }?
att.canonical.attributes =
  att.canonical.attribute.key, att.canonical.attribute.ref
att.canonical.attribute.key =
  
  ## provides an externally-defined means of identifying the entity (or entities) being named, using a coded value of some kind.
  attribute key { data.text }?
att.canonical.attribute.ref =
  
  ## (reference) provides an explicit means of locating a full definition for the entity being named by means of one or more URIs.
  attribute ref {
    list { data.pointer+ }
  }?
att.ranging.attributes =
  att.ranging.attribute.atLeast,
  att.ranging.attribute.atMost,
  att.ranging.attribute.min,
  att.ranging.attribute.max,
  att.ranging.attribute.confidence
att.ranging.attribute.atLeast =
  
  ## gives a minimum estimated value for the approximate measurement.
  attribute atLeast { data.numeric }?
att.ranging.attribute.atMost =
  
  ## gives a maximum estimated value for the approximate measurement.
  attribute atMost { data.numeric }?
att.ranging.attribute.min =
  
  ## where the measurement summarizes more than one observation or a range, supplies the minimum value observed.
  attribute min { data.numeric }?
att.ranging.attribute.max =
  
  ## where the measurement summarizes more than one observation or a range, supplies the maximum value observed.
  attribute max { data.numeric }?
att.ranging.attribute.confidence =
  
  ## specifies the degree of statistical confidence (between zero and one) that a value falls within the range specified by min and max, or the proportion of observed values that fall within that range.
  attribute confidence { data.probability }?
att.dimensions.attributes =
  att.ranging.attributes,
  att.dimensions.attribute.unit,
  att.dimensions.attribute.quantity,
  att.dimensions.attribute.extent,
  att.dimensions.attribute.precision,
  att.dimensions.attribute.scope
att.dimensions.attribute.unit =
  
  ## names the unit used for the measurement
  ## Suggested values include: 1] cm(centimetres) ; 2] mm(millimetres) ; 3] in(inches) ; 4] lines; 5] chars(characters) 
  attribute unit {
    
    ## (centimetres) 
    "cm"
    | 
      ## (millimetres) 
      "mm"
    | 
      ## (inches) 
      "in"
    | 
      ## lines of text
      "lines"
    | 
      ## (characters) characters of text
      "chars"
    | xsd:Name
  }?
att.dimensions.attribute.quantity =
  
  ## specifies the length in the units specified
  attribute quantity { data.numeric }?
att.dimensions.attribute.extent =
  
  ## indicates the size of the object concerned using a project-specific vocabulary combining quantity and units in a single string of words.
  attribute extent { data.text }?
att.dimensions.attribute.precision =
  
  ## characterizes the precision of the values specified by the other attributes.
  attribute precision { data.certainty }?
att.dimensions.attribute.scope =
  
  ## where the measurement summarizes more than one observation, specifies the applicability of this measurement.
  ## Sample values include: 1] all; 2] most; 3] range
  attribute scope { data.enumerated }?
att.breaking.attributes = att.breaking.attribute.break
att.breaking.attribute.break =
  
  ## indicates whether or not the element bearing this attribute should be considered to mark the end of an orthographic token in the same way as whitespace.
  attribute break { data.enumerated }?
att.cReferencing.attributes = att.cReferencing.attribute.cRef
att.cReferencing.attribute.cRef =
  
  ## (canonical reference) specifies the destination of the pointer by supplying a canonical reference expressed using the scheme defined in a refsDecl element in the TEI header
  attribute cRef { data.text }?
att.datable.w3c.attributes =
  att.datable.w3c.attribute.when,
  att.datable.w3c.attribute.notBefore,
  att.datable.w3c.attribute.notAfter,
  att.datable.w3c.attribute.from,
  att.datable.w3c.attribute.to
att.datable.w3c.attribute.when =
  
  ## supplies the value of the date or time in a standard form, e.g. yyyy-mm-dd.
  attribute when { data.temporal.w3c }?
att.datable.w3c.attribute.notBefore =
  
  ## specifies the earliest possible date for the event in standard form, e.g. yyyy-mm-dd.
  attribute notBefore { data.temporal.w3c }?
att.datable.w3c.attribute.notAfter =
  
  ## specifies the latest possible date for the event in standard form, e.g. yyyy-mm-dd.
  attribute notAfter { data.temporal.w3c }?
att.datable.w3c.attribute.from =
  
  ## indicates the starting point of the period in standard form, e.g. yyyy-mm-dd.
  attribute from { data.temporal.w3c }?
att.datable.w3c.attribute.to =
  
  ## indicates the ending point of the period in standard form, e.g. yyyy-mm-dd.
  attribute to { data.temporal.w3c }?
att.datable.attributes =
  att.datable.w3c.attributes,
  att.datable.attribute.calendar,
  att.datable.attribute.period
att.datable.attribute.calendar =
  
  ## indicates the system or calendar to which the date represented by the content of this element belongs.
  attribute calendar { data.pointer }?
sch:pattern [
  id = "tei_odds-att.datable-calendar-calendar-constraint-1"
  "\x{a}" ~
  "      "
  sch:rule [
    context = "tei:*[@calendar]"
    "\x{a}" ~
    "            "
    sch:assert [
      test = "string-length(.) gt 0"
      "\x{a}" ~
      "@calendar indicates the system or calendar to which the date represented by the content of this element\x{a}" ~
      "belongs, but this "
      sch:name [ ]
      " element has no textual content."
    ]
    "\x{a}" ~
    "          "
  ]
  "\x{a}" ~
  "   "
]
att.datable.attribute.period =
  
  ## supplies a pointer to some location defining a named period of time within which the datable item is understood to have occurred.
  attribute period { data.pointer }?
att.datcat.attributes =
  att.datcat.attribute.datcat, att.datcat.attribute.valueDatcat
att.datcat.attribute.datcat =
  
  ## contains a PID (persistent identifier) that aligns the given element with the appropriate Data Category (or categories) in ISOcat.
  attribute ns1:datcat {
    list { data.pointer+ }
  }?
att.datcat.attribute.valueDatcat =
  
  ## contains a PID (persistent identifier) that aligns the content of the given element or the value of the given attribute with the appropriate simple Data Category (or categories) in ISOcat.
  attribute ns1:valueDatcat {
    list { data.pointer+ }
  }?
att.declarable.attributes = att.declarable.attribute.default
att.declarable.attribute.default =
  
  ## indicates whether or not this element is selected by default when its parent is selected.
  [ a:defaultValue = "false" ]
  attribute default {
    
    ## This element is selected if its parent is selected
    "true"
    | 
      ## This element can only be selected explicitly, unless it is the only one of its kind, in which case it is selected if its parent is selected.
      "false"
  }?
att.declaring.attributes = att.declaring.attribute.decls
att.declaring.attribute.decls =
  
  ## identifies one or more declarable elements within the header, which are understood to apply to the element bearing this attribute and its content.
  attribute decls {
    list { data.pointer+ }
  }?
att.fragmentable.attributes = att.fragmentable.attribute.part
att.fragmentable.attribute.part =
  
  ## specifies whether or not its parent element is fragmented in some way, typically by some other overlapping structure: for example a speech which is divided between two or more verse stanzas, a paragraph which is split across a page division, a verse line which is divided between two speakers.
  [ a:defaultValue = "N" ]
  attribute part {
    
    ## (yes) the element is fragmented in some (unspecified) respect
    "Y"
    | 
      ## (no) either the element is not fragmented, or no claim is made as to its completeness.
      "N"
    | 
      ## (initial) this is the initial part of a fragmented element
      "I"
    | 
      ## (medial) this is a medial part of a fragmented element
      "M"
    | 
      ## (final) this is the final part of a fragmented element
      "F"
  }?
att.divLike.attributes =
  att.fragmentable.attributes,
  att.divLike.attribute.org,
  att.divLike.attribute.sample
att.divLike.attribute.org =
  
  ## (organization) specifies how the content of the division is organized.
  [ a:defaultValue = "uniform" ]
  attribute org {
    
    ## no claim is made about the sequence in which the immediate contents of this division are to be processed, or their inter-relationships.
    "composite"
    | 
      ## the immediate contents of this element are regarded as forming a logical unit, to be processed in sequence.
      "uniform"
  }?
att.divLike.attribute.sample =
  
  ## indicates whether this division is a sample of the original source and if so, from which part.
  [ a:defaultValue = "complete" ]
  attribute sample {
    
    ## division lacks material present at end in source.
    "initial"
    | 
      ## division lacks material at start and end.
      "medial"
    | 
      ## division lacks material at start.
      "final"
    | 
      ## position of sampled material within original unknown.
      "unknown"
    | 
      ## division is not a sample.
      "complete"
  }?
att.docStatus.attributes = att.docStatus.attribute.status
att.docStatus.attribute.status =
  
  ## describes the status of a document either currently or, when associated with a dated element, at the time indicated.
  ## Sample values include: 1] approved; 2] candidate; 3] cleared; 4] deprecated; 5] draft; 6] embargoed; 7] expired; 8] frozen; 9] galley; 10] proposed; 11] published; 12] recommendation; 13] submitted; 14] unfinished; 15] withdrawn
  [ a:defaultValue = "draft" ] attribute status { data.enumerated }?
att.responsibility.attributes =
  att.source.attributes,
  att.responsibility.attribute.cert,
  att.responsibility.attribute.resp
att.responsibility.attribute.cert =
  
  ## (certainty) signifies the degree of certainty associated with the intervention or interpretation.
  attribute cert { data.certainty }?
att.responsibility.attribute.resp =
  
  ## (responsible party) indicates the agency responsible for the intervention or interpretation, for example an editor or transcriber.
  attribute resp {
    list { data.pointer+ }
  }?
att.editLike.attributes =
  att.dimensions.attributes,
  att.responsibility.attributes,
  att.editLike.attribute.evidence,
  att.editLike.attribute.instant
att.editLike.attribute.evidence =
  
  ## indicates the nature of the evidence supporting the reliability or accuracy of the intervention or interpretation.
  ## Suggested values include: 1] internal; 2] external; 3] conjecture
  attribute evidence {
    list {
      (
       ## there is internal evidence to support the intervention.
       "internal"
       | 
         ## there is external evidence to support the intervention.
         "external"
       | 
         ## the intervention or interpretation has been made by the editor, cataloguer, or scholar on the basis of their expertise.
         "conjecture"
       | xsd:Name)+
    }
  }?
att.editLike.attribute.instant =
  
  ## indicates whether this is an instant revision or not.
  [ a:defaultValue = "false" ] attribute instant { data.xTruthValue }?
att.global.attributes =
  att.global.linking.attributes,
  att.global.attribute.xmlid,
  att.global.attribute.n,
  att.global.attribute.xmllang,
  att.global.attribute.rend,
  att.global.attribute.style,
  att.global.attribute.rendition,
  att.global.attribute.xmlbase,
  att.global.attribute.xmlspace
att.global.attribute.xmlid =
  
  ## (identifier) provides a unique identifier for the element bearing the attribute.
  attribute xml:id { xsd:ID }?
att.global.attribute.n =
  
  ## (number) gives a number (or other label) for an element, which is not necessarily unique within the document.
  attribute n { data.text }?
att.global.attribute.xmllang =
  
  ## (language) indicates the language of the element content using a tag generated according to BCP 47.
  attribute xml:lang { data.language }?
att.global.attribute.rend =
  
  ## (rendition) indicates how the element in question was rendered or presented in the source text.
  attribute rend {
    list { data.word+ }
  }?
att.global.attribute.style =
  
  ## contains an expression in some formal style definition language which defines the rendering or presentation used for this element in the source text
  attribute style { data.text }?
att.global.attribute.rendition =
  
  ## points to a description of the rendering or presentation used for this element in the source text.
  attribute rendition {
    list { data.pointer+ }
  }?
att.global.attribute.xmlbase =
  
  ## provides a base URI reference with which applications can resolve relative URI references into absolute URI references.
  attribute xml:base { data.pointer }?
att.global.attribute.xmlspace =
  
  ## signals an intention about how white space should be managed by applications.
  attribute xml:space {
    
    ## signals that the application's default white-space processing modes are acceptable
    "default"
    | 
      ## indicates the intent that applications preserve all white space
      "preserve"
  }?
att.handFeatures.attribute.scribe =
  
  ## gives a name or other identifier for the scribe believed to be responsible for this hand.
  attribute scribe { data.name }?
att.handFeatures.attribute.scribeRef =
  
  ## points to a full description of the scribe concerned, typically supplied by a person element elsewhere in the description.
  attribute scribeRef {
    list { data.pointer+ }
  }?
att.handFeatures.attribute.script =
  
  ## characterizes the particular script or writing style used by this hand, for example secretary, copperplate, Chancery, Italian, etc.
  attribute script {
    list { data.name+ }
  }?
att.handFeatures.attribute.scriptRef =
  
  ## points to a full description of the script or writing style used by this hand, typically supplied by a scriptNote element elsewhere in the description.
  attribute scriptRef {
    list { data.pointer+ }
  }?
att.handFeatures.attribute.medium =
  
  ## describes the tint or type of ink, e.g. brown, or other writing medium, e.g. pencil
  attribute medium {
    list { data.enumerated+ }
  }?
att.handFeatures.attribute.scope =
  
  ## specifies how widely this hand is used in the manuscript.
  attribute scope {
    
    ## only this hand is used throughout the manuscript
    "sole"
    | 
      ## this hand is used through most of the manuscript
      "major"
    | 
      ## this hand is used occasionally in the manuscript
      "minor"
  }?
att.internetMedia.attributes = att.internetMedia.attribute.mimeType
att.internetMedia.attribute.mimeType =
  
  ## (MIME media type) specifies the applicable multimedia internet mail extension (MIME) media type
  attribute mimeType {
    list { data.word+ }
  }?
att.media.attributes =
  att.internetMedia.attributes,
  att.media.attribute.width,
  att.media.attribute.height,
  att.media.attribute.scale
att.media.attribute.width =
  
  ## Where the media are displayed, indicates the display width
  attribute width { data.outputMeasurement }?
att.media.attribute.height =
  
  ## Where the media are displayed, indicates the display height
  attribute height { data.outputMeasurement }?
att.media.attribute.scale =
  
  ## Where the media are displayed, indicates a scale factor to be applied when generating the desired display size
  attribute scale { data.numeric }?
att.resourced.attributes = att.resourced.attribute.url
att.resourced.attribute.url =
  
  ## (uniform resource locator) specifies the URL from which the media concerned may be obtained.
  attribute url { data.pointer }
att.measurement.attributes =
  att.measurement.attribute.unit,
  att.measurement.attribute.quantity,
  att.measurement.attribute.commodity
att.measurement.attribute.unit =
  
  ## indicates the units used for the measurement, usually using the standard symbol for the desired units.
  ## Suggested values include: 1] m(metre) ; 2] kg(kilogram) ; 3] s(second) ; 4] Hz(hertz) ; 5] Pa(pascal) ; 6] Ω(ohm) ; 7] L(litre) ; 8] t(tonne) ; 9] ha(hectare) ; 10] Å(ångström) ; 11] mL(millilitre) ; 12] cm(centimetre) ; 13] dB(decibel) ; 14] kbit(kilobit) ; 15] Kibit(kibibit) ; 16] kB(kilobyte) ; 17] KiB(kibibyte) ; 18] MB(megabyte) ; 19] MiB(mebibyte) 
  attribute unit {
    
    ## (metre) SI base unit of length
    "m"
    | 
      ## (kilogram) SI base unit of mass
      "kg"
    | 
      ## (second) SI base unit of time
      "s"
    | 
      ## (hertz) SI unit of frequency
      "Hz"
    | 
      ## (pascal) SI unit of pressure or stress
      "Pa"
    | 
      ## (ohm) SI unit of electric resistance
      "Ω"
    | 
      ## (litre) 1 dm³
      "L"
    | 
      ## (tonne) 10³ kg
      "t"
    | 
      ## (hectare) 1 hm²
      "ha"
    | 
      ## (ångström) 10⁻¹⁰ m
      "Å"
    | 
      ## (millilitre) 
      "mL"
    | 
      ## (centimetre) 
      "cm"
    | 
      ## (decibel) see remarks, below
      "dB"
    | 
      ## (kilobit) 10³ or 1000 bits
      "kbit"
    | 
      ## (kibibit) 2¹⁰ or 1024 bits
      "Kibit"
    | 
      ## (kilobyte) 10³ or 1000 bytes
      "kB"
    | 
      ## (kibibyte) 2¹⁰ or 1024 bytes
      "KiB"
    | 
      ## (megabyte) 10⁶ or 1 000 000 bytes
      "MB"
    | 
      ## (mebibyte) 2²⁰ or 1 048 576 bytes
      "MiB"
    | xsd:Name
  }?
att.measurement.attribute.quantity =
  
  ## specifies the number of the specified units that comprise the measurement
  attribute quantity { data.numeric }?
att.measurement.attribute.commodity =
  
  ## indicates the substance that is being measured
  attribute commodity {
    list { data.word+ }
  }?
att.naming.attributes =
  att.canonical.attributes,
  att.naming.attribute.role,
  att.naming.attribute.nymRef
att.naming.attribute.role =
  
  ## may be used to specify further information about the entity referenced by this name in the form of a set of whitespace-separated values, for example the occupation of a person, or the status of a place.
  attribute role {
    list { data.enumerated+ }
  }?
att.naming.attribute.nymRef =
  
  ## (reference to the canonical name) provides a means of locating the canonical form (nym) of the names associated with the object named by the element bearing it.
  attribute nymRef {
    list { data.pointer+ }
  }?
att.placement.attributes = att.placement.attribute.place
att.placement.attribute.place =
  
  ## specifies where this item is placed
  ## Suggested values include: 1] below; 2] bottom; 3] margin; 4] top; 5] opposite; 6] overleaf; 7] above; 8] end; 9] inline; 10] inspace
  attribute place {
    list {
      (
       ## below the line
       "below"
       | 
         ## at the foot of the page
         "bottom"
       | 
         ## in the margin (left, right, or both)
         "margin"
       | 
         ## at the top of the page
         "top"
       | 
         ## on the opposite, i.e. facing, page
         "opposite"
       | 
         ## on the other side of the leaf
         "overleaf"
       | 
         ## above the line
         "above"
       | 
         ## at the end of e.g. chapter or volume.
         "end"
       | 
         ## within the body of the text.
         "inline"
       | 
         ## in a predefined space, for example left by an earlier scribe.
         "inspace"
       | xsd:Name)+
    }
  }?
att.typed.attributes =
  att.typed.attribute.type, att.typed.attribute.subtype
att.typed.attribute.type =
  
  ## characterizes the element in some sense, using any convenient classification scheme or typology.
  attribute type { data.enumerated }?
att.typed.attribute.subtype =
  
  ## provides a sub-categorization of the element, if needed
  attribute subtype { data.enumerated }?
sch:pattern [
  id = "tei_odds-att.typed-subtypeTyped-constraint-2"
  "\x{a}" ~
  "      "
  sch:rule [
    context = "*[@subtype]"
    "\x{a}" ~
    "        "
    sch:assert [
      test = "@type"
      "The "
      sch:name [ ]
      " element should not be categorized in detail with @subtype\x{a}" ~
      " unless also categorized in general with @type"
    ]
    "\x{a}" ~
    "      "
  ]
  "\x{a}" ~
  "   "
]
att.pointing.attributes =
  att.pointing.attribute.targetLang,
  att.pointing.attribute.target,
  att.pointing.attribute.evaluate
att.pointing.attribute.targetLang =
  
  ## specifies the language of the content to be found at the destination referenced by target, using a language tag generated according to BCP 47.
  attribute targetLang { data.language }?
sch:pattern [
  id = "tei_odds-att.pointing-targetLang-targetLang-constraint-3"
  "\x{a}" ~
  "      "
  sch:rule [
    context = "tei:*[not(self::tei:schemaSpec)][@targetLang]"
    "\x{a}" ~
    "            "
    sch:assert [
      test = "count(@target)"
      "@targetLang can only be used if @target is specified."
    ]
    "\x{a}" ~
    "          "
  ]
  "\x{a}" ~
  "   "
]
att.pointing.attribute.target =
  
  ## specifies the destination of the reference by supplying one or more URI References
  attribute target {
    list { data.pointer+ }
  }?
att.pointing.attribute.evaluate =
  
  ## specifies the intended meaning when the target of a pointer is itself a pointer.
  attribute evaluate {
    
    ## if the element pointed to is itself a pointer, then the target of that pointer will be taken, and so on, until an element is found which is not a pointer.
    "all"
    | 
      ## if the element pointed to is itself a pointer, then its target (whether a pointer or not) is taken as the target of this pointer.
      "one"
    | 
      ## no further evaluation of targets is carried out beyond that needed to find the element specified in the pointer's target.
      "none"
  }?
att.pointing.group.attributes =
  att.pointing.attributes,
  att.typed.attributes,
  att.pointing.group.attribute.domains,
  att.pointing.group.attribute.targFunc
att.pointing.group.attribute.domains =
  
  ## optionally specifies the identifiers of the elements within which all elements indicated by the contents of this element lie.
  attribute domains {
    list { data.pointer, data.pointer, data.pointer* }
  }?
att.pointing.group.attribute.targFunc =
  
  ## (target function) describes the function of each of the values of the target attribute of the enclosed link, join, or alt tags.
  attribute targFunc {
    list { data.word, data.word, data.word* }
  }?
att.readFrom.attributes = att.readFrom.attribute.source
att.readFrom.attribute.source =
  
  ## specifies the source from which declarations and definitions for the components of the object being defined may be obtained.
  attribute source { data.pointer }?
att.segLike.attributes =
  att.datcat.attributes,
  att.fragmentable.attributes,
  att.segLike.attribute.function
att.segLike.attribute.function =
  
  ## characterizes the function of the segment.
  attribute function { data.enumerated }?
att.sortable.attributes = att.sortable.attribute.sortKey
att.sortable.attribute.sortKey =
  
  ## supplies the sort key for this element in an index, list or group which contains it.
  attribute sortKey { data.word }?
att.edition.attributes =
  att.edition.attribute.ed, att.edition.attribute.edRef
att.edition.attribute.ed =
  
  ## (edition) supplies a sigil or other arbitrary identifier for the source edition in which the associated feature (for example, a page, column, or line break) occurs at this point in the text.
  attribute ed {
    list { data.word+ }
  }?
att.edition.attribute.edRef =
  
  ## (edition reference) provides a pointer to the source edition in which the associated feature (for example, a page, column, or line break) occurs at this point in the text.
  attribute edRef {
    list { data.pointer+ }
  }?
att.spanning.attributes = att.spanning.attribute.spanTo
att.spanning.attribute.spanTo =
  
  ## indicates the end of a span initiated by the element bearing this attribute.
  attribute spanTo { data.pointer }?
sch:pattern [
  id = "tei_odds-att.spanning-spanTo-spanTo-2-constraint-4"
  "\x{a}" ~
  "      "
  sch:rule [
    context = "tei:*[@spanTo]"
    "\x{a}" ~
    "            "
    sch:assert [
      test =
        "id(substring(@spanTo,2)) and following::*[@xml:id=substring(current()/@spanTo,2)]"
      "\x{a}" ~
      "The element indicated by @spanTo ("
      sch:value-of [ select = "@spanTo" ]
      ") must follow the current element "
      sch:name [ ]
      "\x{a}" ~
      "                  "
    ]
    "\x{a}" ~
    "          "
  ]
  "\x{a}" ~
  "   "
]
att.styleDef.attributes =
  att.styleDef.attribute.scheme, att.styleDef.attribute.schemeVersion
att.styleDef.attribute.scheme =
  
  ## identifies the language used to describe the rendition.
  attribute scheme {
    
    ## Cascading Stylesheet Language
    "css"
    | 
      ## Extensible Stylesheet Language Formatting Objects
      "xslfo"
    | 
      ## Informal free text description
      "free"
    | 
      ## A user-defined rendition description language
      "other"
  }?
att.styleDef.attribute.schemeVersion =
  
  ## supplies a version number for the style language provided in scheme.
  attribute schemeVersion { data.versionNumber }?
sch:pattern [
  id =
    "tei_odds-att.styleDef-schemeVersion-schemeVersionRequiresScheme-constraint-5"
  "\x{a}" ~
  "      "
  sch:rule [
    context = "tei:*[@schemeVersion]"
    "\x{a}" ~
    "            "
    sch:assert [
      test = "@scheme and not(@scheme = 'free')"
      "\x{a}" ~
      "              @schemeVersion can only be used if @scheme is specified.\x{a}" ~
      "            "
    ]
    "\x{a}" ~
    "          "
  ]
  "\x{a}" ~
  "   "
]
att.tableDecoration.attributes =
  att.tableDecoration.attribute.role,
  att.tableDecoration.attribute.rows,
  att.tableDecoration.attribute.cols
att.tableDecoration.attribute.role =
  
  ## indicates the kind of information held in this cell or in each cell of this row.
  ## Suggested values include: 1] label; 2] data
  [ a:defaultValue = "data" ]
  attribute role {
    
    ## labelling or descriptive information only.
    "label"
    | 
      ## data values.
      "data"
    | xsd:Name
  }?
att.tableDecoration.attribute.rows =
  
  ## indicates the number of rows occupied by this cell or row.
  [ a:defaultValue = "1" ] attribute rows { data.count }?
att.tableDecoration.attribute.cols =
  
  ## (columns) indicates the number of columns occupied by this cell or row.
  [ a:defaultValue = "1" ] attribute cols { data.count }?
att.timed.attributes =
  att.timed.attribute.start, att.timed.attribute.end
att.timed.attribute.start =
  
  ## indicates the location within a temporal alignment at which this element begins.
  attribute start { data.pointer }?
att.timed.attribute.end =
  
  ## indicates the location within a temporal alignment at which this element ends.
  attribute end { data.pointer }?
att.transcriptional.attributes =
  att.editLike.attributes,
  att.transcriptional.attribute.hand,
  att.transcriptional.attribute.status,
  att.transcriptional.attribute.cause,
  att.transcriptional.attribute.seq
att.transcriptional.attribute.hand =
  
  ## indicates the hand of the agent which made the intervention.
  attribute hand { data.pointer }?
att.transcriptional.attribute.status =
  
  ## indicates the effect of the intervention, for example in the case of a deletion, strikeouts which include too much or too little text, or in the case of an addition, an insertion which duplicates some of the text already present.
  ## Sample values include: 1] duplicate; 2] duplicate-partial; 3] excessStart; 4] excessEnd; 5] shortStart; 6] shortEnd; 7] partial; 8] unremarkable
  [ a:defaultValue = "unremarkable" ]
  attribute status { data.enumerated }?
att.transcriptional.attribute.cause =
  
  ## documents the presumed cause for the intervention.
  attribute cause {
    
    ## repeated for the purpose of fixation
    "fix"
    | 
      ## repeated to clarify a previously illegible or badly written text or mark
      "unclear"
  }?
att.transcriptional.attribute.seq =
  
  ## (sequence) assigns a sequence number related to the order in which the encoded features carrying this attribute are believed to have occurred.
  attribute seq { data.count }?
att.translatable.attributes = att.translatable.attribute.versionDate
att.translatable.attribute.versionDate =
  
  ## specifies the date on which the source text was extracted and sent to the translator
  attribute versionDate { data.temporal.w3c }?
att.citing.attributes =
  att.citing.attribute.unit,
  att.citing.attribute.from,
  att.citing.attribute.to
att.citing.attribute.unit =
  
  ## identifies the unit of information conveyed by the element, e.g. columns, pages, volume.
  ## Suggested values include: 1] volume; 2] issue; 3] page; 4] line; 5] chapter; 6] part; 7] column
  attribute unit {
    
    ## the element contains a volume number.
    "volume"
    | 
      ## the element contains an issue number, or volume and issue numbers.
      "issue"
    | 
      ## the element contains a page number or page range.
      "page"
    | 
      ## the element contains a line number or line range.
      "line"
    | 
      ## the element contains a chapter indication (number and/or title)
      "chapter"
    | 
      ## the element identifies a part of a book or collection.
      "part"
    | 
      ## the element identifies a column.
      "column"
    | xsd:Name
  }?
att.citing.attribute.from =
  
  ## specifies the starting point of the range of units indicated by the unit attribute.
  attribute from { data.word }?
att.citing.attribute.to =
  
  ## specifies the end-point of the range of units indicated by the unit attribute.
  attribute to { data.word }?
model.nameLike.agent = name
model.nameLike.agent_alternation = name
model.nameLike.agent_sequence = name
model.nameLike.agent_sequenceOptional = name?
model.nameLike.agent_sequenceOptionalRepeatable = name*
model.nameLike.agent_sequenceRepeatable = name+
model.segLike = seg
model.hiLike = hi
model.hiLike_alternation = hi
model.hiLike_sequence = hi
model.hiLike_sequenceOptional = hi?
model.hiLike_sequenceOptionalRepeatable = hi*
model.hiLike_sequenceRepeatable = hi+
model.emphLike =
  foreign
  | emph
  | distinct
  | mentioned
  | soCalled
  | gloss
  | term
  | title
  | code
  | ident
model.emphLike_alternation =
  foreign
  | emph
  | distinct
  | mentioned
  | soCalled
  | gloss
  | term
  | title
  | code
  | ident
model.emphLike_sequence =
  foreign,
  emph,
  distinct,
  mentioned,
  soCalled,
  gloss,
  term,
  title,
  code,
  ident
model.emphLike_sequenceOptional =
  foreign?,
  emph?,
  distinct?,
  mentioned?,
  soCalled?,
  gloss?,
  term?,
  title?,
  code?,
  ident?
model.emphLike_sequenceOptionalRepeatable =
  foreign*,
  emph*,
  distinct*,
  mentioned*,
  soCalled*,
  gloss*,
  term*,
  title*,
  code*,
  ident*
model.emphLike_sequenceRepeatable =
  foreign+,
  emph+,
  distinct+,
  mentioned+,
  soCalled+,
  gloss+,
  term+,
  title+,
  code+,
  ident+
model.highlighted = model.hiLike | model.emphLike
model.dateLike = date | time
model.dateLike_alternation = date | time
model.dateLike_sequence = date, time
model.dateLike_sequenceOptional = date?, time?
model.dateLike_sequenceOptionalRepeatable = date*, time*
model.dateLike_sequenceRepeatable = date+, time+
model.measureLike = num | measure | measureGrp
model.measureLike_alternation = num | measure | measureGrp
model.measureLike_sequence = num, measure, measureGrp
model.measureLike_sequenceOptional = num?, measure?, measureGrp?
model.measureLike_sequenceOptionalRepeatable =
  num*, measure*, measureGrp*
model.measureLike_sequenceRepeatable = num+, measure+, measureGrp+
model.egLike = eg | egXML
model.egLike_alternation = eg | egXML
model.egLike_sequence = eg, egXML
model.egLike_sequenceOptional = eg?, egXML?
model.egLike_sequenceOptionalRepeatable = eg*, egXML*
model.egLike_sequenceRepeatable = eg+, egXML+
model.graphicLike = media | graphic | binaryObject | formula
model.offsetLike = notAllowed
model.offsetLike_alternation = notAllowed
model.offsetLike_sequence = empty
model.offsetLike_sequenceOptional = empty
model.offsetLike_sequenceOptionalRepeatable = empty
model.offsetLike_sequenceRepeatable = notAllowed
model.pPart.msdesc = notAllowed
model.pPart.editorial = choice | abbr | expan
model.pPart.editorial_alternation = choice | abbr | expan
model.pPart.editorial_sequence = choice, abbr, expan
model.pPart.editorial_sequenceOptional = choice?, abbr?, expan?
model.pPart.editorial_sequenceOptionalRepeatable =
  choice*, abbr*, expan*
model.pPart.editorial_sequenceRepeatable = choice+, abbr+, expan+
model.pPart.transcriptional =
  sic | corr | reg | orig | add | del | unclear
model.pPart.transcriptional_alternation =
  sic | corr | reg | orig | add | del | unclear
model.pPart.transcriptional_sequence =
  sic, corr, reg, orig, add, del, unclear
model.pPart.transcriptional_sequenceOptional =
  sic?, corr?, reg?, orig?, add?, del?, unclear?
model.pPart.transcriptional_sequenceOptionalRepeatable =
  sic*, corr*, reg*, orig*, add*, del*, unclear*
model.pPart.transcriptional_sequenceRepeatable =
  sic+, corr+, reg+, orig+, add+, del+, unclear+
model.pPart.edit = model.pPart.editorial | model.pPart.transcriptional
model.ptrLike = ptr | ref
model.lPart = notAllowed
model.global.meta =
  index | link | linkGrp | timeline | join | joinGrp | alt | altGrp
model.milestoneLike = milestone | gb | pb | lb | cb | anchor
model.gLike = g
model.oddDecl =
  moduleSpec
  | specGrp
  | specGrpRef
  | elementSpec
  | classSpec
  | macroSpec
  | listRef
  | constraintSpec
model.oddDecl_alternation =
  moduleSpec
  | specGrp
  | specGrpRef
  | elementSpec
  | classSpec
  | macroSpec
  | listRef
  | constraintSpec
model.oddDecl_sequence =
  moduleSpec,
  specGrp,
  specGrpRef,
  elementSpec,
  classSpec,
  macroSpec,
  listRef,
  constraintSpec
model.oddDecl_sequenceOptional =
  moduleSpec?,
  specGrp?,
  specGrpRef?,
  elementSpec?,
  classSpec?,
  macroSpec?,
  listRef?,
  constraintSpec?
model.oddDecl_sequenceOptionalRepeatable =
  moduleSpec*,
  specGrp*,
  specGrpRef*,
  elementSpec*,
  classSpec*,
  macroSpec*,
  listRef*,
  constraintSpec*
model.oddDecl_sequenceRepeatable =
  moduleSpec+,
  specGrp+,
  specGrpRef+,
  elementSpec+,
  classSpec+,
  macroSpec+,
  listRef+,
  constraintSpec+
model.oddRef = classRef | elementRef | macroRef | moduleRef
model.phrase.xml = att | gi | tag | val
model.specDescLike = specList | specDesc
model.biblLike = bibl | biblStruct | listBibl | biblFull
model.biblLike_alternation = bibl | biblStruct | listBibl | biblFull
model.biblLike_sequence = bibl, biblStruct, listBibl, biblFull
model.biblLike_sequenceOptional =
  bibl?, biblStruct?, listBibl?, biblFull?
model.biblLike_sequenceOptionalRepeatable =
  bibl*, biblStruct*, listBibl*, biblFull*
model.biblLike_sequenceRepeatable =
  bibl+, biblStruct+, listBibl+, biblFull+
model.headLike = head
model.headLike_alternation = head
model.headLike_sequence = head
model.headLike_sequenceOptional = head?
model.headLike_sequenceOptionalRepeatable = head*
model.headLike_sequenceRepeatable = head+
model.labelLike = desc | label
model.labelLike_alternation = desc | label
model.labelLike_sequence = desc, label
model.labelLike_sequenceOptional = desc?, label?
model.labelLike_sequenceOptionalRepeatable = desc*, label*
model.labelLike_sequenceRepeatable = desc+, label+
model.listLike = \list | table
model.listLike_alternation = \list | table
model.listLike_sequence = \list, table
model.listLike_sequenceOptional = \list?, table?
model.listLike_sequenceOptionalRepeatable = \list*, table*
model.listLike_sequenceRepeatable = \list+, table+
model.noteLike = note
model.lLike = l
model.lLike_alternation = l
model.lLike_sequence = l
model.lLike_sequenceOptional = l?
model.lLike_sequenceOptionalRepeatable = l*
model.lLike_sequenceRepeatable = l+
model.pLike = p | ab
model.pLike_alternation = p | ab
model.pLike_sequence = p, ab
model.pLike_sequenceOptional = p?, ab?
model.pLike_sequenceOptionalRepeatable = p*, ab*
model.pLike_sequenceRepeatable = p+, ab+
model.stageLike = stage
model.stageLike_alternation = stage
model.stageLike_sequence = stage
model.stageLike_sequenceOptional = stage?
model.stageLike_sequenceOptionalRepeatable = stage*
model.stageLike_sequenceRepeatable = stage+
model.entryPart =
  superEntry
  | hom
  | sense
  | form
  | orth
  | pron
  | hyph
  | syll
  | gramGrp
  | pos
  | subc
  | colloc
  | def
  | etym
  | usg
  | lbl
  | xr
  | re
model.entryPart.top =
  cit | dictScrap | form | gramGrp | def | etym | usg | xr | re
model.global.edit = gap
model.divPart = model.lLike | model.pLike | lg | sp | schemaSpec
model.placeNamePart = notAllowed
model.placeNamePart_alternation = notAllowed
model.placeNamePart_sequence = empty
model.placeNamePart_sequenceOptional = empty
model.placeNamePart_sequenceOptionalRepeatable = empty
model.placeNamePart_sequenceRepeatable = notAllowed
model.placeStateLike = model.placeNamePart
model.placeStateLike_alternation = model.placeNamePart_alternation
model.placeStateLike_sequence = model.placeNamePart_sequence
model.placeStateLike_sequenceOptional =
  model.placeNamePart_sequenceOptional?
model.placeStateLike_sequenceOptionalRepeatable =
  model.placeNamePart_sequenceOptionalRepeatable*
model.placeStateLike_sequenceRepeatable =
  model.placeNamePart_sequenceRepeatable+
model.publicationStmtPart.agency = publisher | distributor | authority
model.publicationStmtPart.detail =
  address | date | pubPlace | idno | availability
model.availabilityPart = licence
model.certLike = notAllowed
model.descLike = desc
model.glossLike = gloss | equiv | altIdent
model.quoteLike = quote | cit
model.quoteLike_alternation = quote | cit
model.quoteLike_sequence = quote, cit
model.quoteLike_sequenceOptional = quote?, cit?
model.quoteLike_sequenceOptionalRepeatable = quote*, cit*
model.quoteLike_sequenceRepeatable = quote+, cit+
model.qLike = model.quoteLike | said | q | floatingText
model.qLike_alternation =
  model.quoteLike_alternation | said | q | floatingText
model.qLike_sequence = model.quoteLike_sequence, said, q, floatingText
model.qLike_sequenceOptional =
  model.quoteLike_sequenceOptional?, said?, q?, floatingText?
model.qLike_sequenceOptionalRepeatable =
  model.quoteLike_sequenceOptionalRepeatable*, said*, q*, floatingText*
model.qLike_sequenceRepeatable =
  model.quoteLike_sequenceRepeatable+, said+, q+, floatingText+
model.respLike =
  author | editor | respStmt | meeting | sponsor | funder | principal
model.divWrapper =
  meeting
  | byline
  | dateline
  | argument
  | epigraph
  | salute
  | docAuthor
  | docDate
model.divTopPart = model.headLike | opener | signed
model.divTop = model.divWrapper | model.divTopPart
model.frontPart.drama = notAllowed
model.pLike.front =
  head
  | byline
  | argument
  | epigraph
  | docTitle
  | titlePart
  | docAuthor
  | docEdition
  | docImprint
  | docDate
model.divBottomPart = trailer | closer | signed | postscript
model.divBottom = model.divWrapper | model.divBottomPart
model.titlepagePart =
  graphic
  | binaryObject
  | byline
  | argument
  | epigraph
  | docTitle
  | titlePart
  | docAuthor
  | imprimatur
  | docEdition
  | docImprint
  | docDate
model.choicePart =
  sic | corr | reg | orig | unclear | abbr | expan | seg
model.imprintPart = publisher | biblScope | pubPlace | distributor
model.catDescPart = notAllowed
model.addressLike = email | address
model.addressLike_alternation = email | address
model.addressLike_sequence = email, address
model.addressLike_sequenceOptional = email?, address?
model.addressLike_sequenceOptionalRepeatable = email*, address*
model.addressLike_sequenceRepeatable = email+, address+
model.nameLike =
  model.nameLike.agent
  | model.offsetLike
  | model.placeStateLike
  | rs
  | idno
  | lang
model.nameLike_alternation =
  model.nameLike.agent_alternation
  | model.offsetLike_alternation
  | model.placeStateLike_alternation
  | rs
  | idno
  | lang
model.nameLike_sequence =
  model.nameLike.agent_sequence,
  model.offsetLike_sequence,
  model.placeStateLike_sequence,
  rs,
  idno,
  lang
model.nameLike_sequenceOptional =
  model.nameLike.agent_sequenceOptional?,
  model.offsetLike_sequenceOptional?,
  model.placeStateLike_sequenceOptional?,
  rs?,
  idno?,
  lang?
model.nameLike_sequenceOptionalRepeatable =
  model.nameLike.agent_sequenceOptionalRepeatable*,
  model.offsetLike_sequenceOptionalRepeatable*,
  model.placeStateLike_sequenceOptionalRepeatable*,
  rs*,
  idno*,
  lang*
model.nameLike_sequenceRepeatable =
  model.nameLike.agent_sequenceRepeatable+,
  model.offsetLike_sequenceRepeatable+,
  model.placeStateLike_sequenceRepeatable+,
  rs+,
  idno+,
  lang+
model.global =
  model.global.meta
  | model.milestoneLike
  | model.noteLike
  | model.global.edit
  | notatedMusic
  | figure
model.biblPart =
  model.respLike
  | model.imprintPart
  | series
  | citedRange
  | bibl
  | relatedItem
  | textLang
  | edition
  | extent
  | availability
model.frontPart = model.frontPart.drama | divGen | titlePage
model.addrPart = model.nameLike | addrLine | street | postCode | postBox
model.pPart.data =
  model.dateLike
  | model.measureLike
  | model.addressLike
  | model.nameLike
model.inter =
  model.egLike
  | model.oddDecl
  | model.biblLike
  | model.labelLike
  | model.listLike
  | model.stageLike
  | model.qLike
model.common = model.divPart | model.inter | model.entryLike
model.phrase =
  model.segLike
  | model.highlighted
  | model.graphicLike
  | model.pPart.msdesc
  | model.pPart.edit
  | model.ptrLike
  | model.lPart
  | model.phrase.xml
  | model.specDescLike
  | model.pPart.data
  | model.ptrLike.form
model.limitedPhrase =
  model.hiLike
  | model.emphLike
  | model.pPart.msdesc
  | model.pPart.editorial
  | model.ptrLike
  | model.phrase.xml
  | model.pPart.data
model.divLike = \div
model.divGenLike = divGen
model.div1Like = div1
model.div2Like = div2
model.div3Like = div3
model.div4Like = div4
model.div5Like = div5
model.div6Like = div6
model.div7Like = div7
model.applicationLike = application
model.teiHeaderPart = encodingDesc | profileDesc
model.sourceDescPart = notAllowed
model.encodingDescPart =
  projectDesc
  | samplingDecl
  | editorialDecl
  | tagsDecl
  | styleDefDecl
  | refsDecl
  | listPrefixDef
  | classDecl
  | geoDecl
  | appInfo
  | charDecl
  | schemaSpec
model.editorialDeclPart =
  correction
  | normalization
  | quotation
  | hyphenation
  | segmentation
  | stdVals
  | interpretation
  | punctuation
model.profileDescPart =
  abstract | creation | langUsage | textClass | calendarDesc
att.source.attributes = att.source.attribute.source
att.source.attribute.source =
  
  ## provides a pointer to the bibliographical source from which a quotation or citation is drawn.
  attribute source {
    list { data.pointer+ }
  }?
model.resourceLike = notAllowed
att.personal.attributes =
  att.naming.attributes,
  att.personal.attribute.full,
  att.personal.attribute.sort
att.personal.attribute.full =
  
  ## indicates whether the name component is given in full, as an abbreviation or simply as an initial.
  [ a:defaultValue = "yes" ]
  attribute full {
    
    ## the name component is spelled out in full.
    "yes"
    | 
      ## (abbreviated) the name component is given in an abbreviated form.
      "abb"
    | 
      ## (initial letter) the name component is indicated only by one initial.
      "init"
  }?
att.personal.attribute.sort =
  
  ## specifies the sort order of the name component in relation to others within the name.
  attribute sort { data.count }?
att.milestoneUnit.attributes = att.milestoneUnit.attribute.unit
att.milestoneUnit.attribute.unit =
  
  ## provides a conventional name for the kind of section changing at this milestone.
  ## Suggested values include: 1] page; 2] column; 3] line; 4] book; 5] poem; 6] canto; 7] speaker; 8] stanza; 9] act; 10] scene; 11] section; 12] absent; 13] unnumbered
  attribute unit {
    
    ## physical page breaks (synonymous with the pb element).
    "page"
    | 
      ## column breaks.
      "column"
    | 
      ## line breaks (synonymous with the lb element).
      "line"
    | 
      ## any units termed book, liber, etc.
      "book"
    | 
      ## individual poems in a collection.
      "poem"
    | 
      ## cantos or other major sections of a poem.
      "canto"
    | 
      ## changes of speaker or narrator.
      "speaker"
    | 
      ## stanzas within a poem, book, or canto.
      "stanza"
    | 
      ## acts within a play.
      "act"
    | 
      ## scenes within a play or act.
      "scene"
    | 
      ## sections of any kind.
      "section"
    | 
      ## passages not present in the reference edition.
      "absent"
    | 
      ## passages present in the text, but not to be included as part of the reference.
      "unnumbered"
    | xsd:Name
  }
p =
  
  ## (paragraph) marks paragraphs in prose. [3.1.  7.2.5. ]
  element p {
    macro.paraContent,
    att.global.attributes,
    att.declaring.attributes,
    att.fragmentable.attributes,
    empty
  }
foreign =
  
  ## identifies a word or phrase as belonging to some language other than that of the surrounding text. [3.3.2.1. ]
  element foreign { macro.phraseSeq, att.global.attributes, empty }
emph =
  
  ## (emphasized) marks words or phrases which are stressed or emphasized for linguistic or rhetorical effect. [3.3.2.2.  3.3.2. ]
  element emph { macro.paraContent, att.global.attributes, empty }
hi =
  
  ## (highlighted) marks a word or phrase as graphically distinct from the surrounding text, for reasons concerning which no claim is made. [3.3.2.2.  3.3.2. ]
  element hi { macro.paraContent, att.global.attributes, empty }
distinct =
  
  ## identifies any word or phrase which is regarded as linguistically distinct, for example as archaic, technical, dialectal, non-preferred, etc., or as forming part of a sublanguage. [3.3.2.3. ]
  element distinct {
    macro.phraseSeq,
    att.global.attributes,
    
    ## specifies the sublanguage or register to which the word or phrase is being assigned
    attribute type { data.enumerated }?,
    
    ## specifies how the phrase is distinct diachronically
    attribute time { data.text }?,
    
    ## specifies how the phrase is distinct diatopically
    attribute space { data.text }?,
    
    ## specifies how the phrase is distinct diastatically
    attribute social { data.text }?,
    empty
  }
said =
  
  ## (speech or thought) indicates passages thought or spoken aloud, whether explicitly indicated in the source or not, whether directly or indirectly reported, whether by real people or fictional characters. [3.3.3. ]
  element said {
    macro.specialPara,
    att.global.attributes,
    att.ascribed.attributes,
    
    ## may be used to indicate whether the quoted matter is regarded as having been vocalized or signed.
    [ a:defaultValue = "unknown" ]
    attribute aloud { data.xTruthValue }?,
    
    ## may be used to indicate whether the quoted matter is regarded as direct or indirect speech.
    [ a:defaultValue = "true" ] attribute direct { data.xTruthValue }?,
    empty
  }
quote =
  
  ## (quotation) contains a phrase or passage attributed by the narrator or author to some agency external to the text. [3.3.3.  4.3.1. ]
  element quote {
    macro.specialPara,
    att.global.attributes,
    att.typed.attributes,
    att.source.attributes,
    empty
  }
q =
  
  ## (quoted) contains material which is distinguished from the surrounding text using quotation marks or a similar method, for any one of a variety of reasons including, but not limited to: direct speech or thought, technical terms or jargon, authorial distance, quotations from elsewhere, and passages that are mentioned but not used. [3.3.3. ]
  element q {
    macro.specialPara,
    att.global.attributes,
    att.ascribed.attributes,
    att.source.attributes,
    
    ## may be used to indicate whether the offset passage is spoken or thought, or to characterize it more finely.
    ## Suggested values include: 1] spoken; 2] thought; 3] written; 4] soCalled; 5] foreign; 6] distinct; 7] term; 8] emph; 9] mentioned
    attribute type {
      
      ## representation of speech
      "spoken"
      | 
        ## representation of thought, e.g. internal monologue
        "thought"
      | 
        ## quotation from a written source
        "written"
      | 
        ## authorial distance
        "soCalled"
      | 
        ##
        "foreign"
      | 
        ## linguistically distinct
        "distinct"
      | 
        ## technical term
        "term"
      | 
        ## rhetorically emphasized
        "emph"
      | 
        ## refering to itself, not its normal referent
        "mentioned"
      | xsd:Name
    }?,
    empty
  }
cit =
  
  ## (cited quotation) contains a quotation from some other document, together with a bibliographic reference to its source. In a dictionary it may contain an example text with at least one occurrence of the word form, used in the sense being described, or a translation of the headword, or an example. [3.3.3.  4.3.1.  9.3.5.1. ]
  element cit {
    (model.qLike
     | model.egLike
     | model.biblLike
     | model.ptrLike
     | model.global
     | model.entryPart)+,
    att.global.attributes,
    att.typed.attributes,
    empty
  }
mentioned =
  
  ## marks words or phrases mentioned, not used. [3.3.3. ]
  element mentioned { macro.phraseSeq, att.global.attributes, empty }
soCalled =
  
  ## contains a word or phrase for which the author or narrator indicates a disclaiming of responsibility, for example by the use of scare quotes or italics. [3.3.3. ]
  element soCalled { macro.phraseSeq, att.global.attributes, empty }
desc =
  
  ## (description) contains a brief description of the object documented by its parent element, including its intended usage, purpose, or application where this is appropriate. [22.4.1. ]
  element desc {
    macro.limitedContent,
    att.global.attributes,
    att.translatable.attributes,
    att.typed.attributes,
    empty
  }
gloss =
  
  ## identifies a phrase or word used to provide a gloss or definition for some other word or phrase. [3.3.4.  22.4.1. ]
  element gloss {
    macro.phraseSeq,
    att.global.attributes,
    att.declaring.attributes,
    att.translatable.attributes,
    att.typed.attributes,
    att.pointing.attributes,
    att.cReferencing.attributes,
    empty
  }
term =
  
  ## contains a single-word, multi-word, or symbolic designation which is regarded as a technical term. [3.3.4. ]
  element term {
    macro.phraseSeq,
    att.global.attributes,
    att.declaring.attributes,
    att.pointing.attributes,
    att.typed.attributes,
    att.canonical.attributes,
    att.sortable.attributes,
    att.cReferencing.attributes,
    empty
  }
sic =
  
  ## (Latin for thus or so
  ##    ) contains text reproduced although apparently incorrect or inaccurate. [3.4.1. ]
  element sic {
    macro.paraContent,
    att.global.attributes,
    att.responsibility.attributes,
    empty
  }
corr =
  
  ## (correction) contains the correct form of a passage apparently erroneous in the copy text. [3.4.1. ]
  element corr {
    macro.paraContent,
    att.global.attributes,
    att.editLike.attributes,
    att.typed.attributes,
    empty
  }
choice =
  
  ## groups a number of alternative encodings for the same point in a text. [3.4. ]
  element choice {
    (model.choicePart | choice)*, att.global.attributes, empty
  }
reg =
  
  ## (regularization) contains a reading which has been regularized or normalized in some sense. [3.4.2.  12. ]
  element reg {
    macro.paraContent,
    att.global.attributes,
    att.editLike.attributes,
    att.typed.attributes,
    empty
  }
orig =
  
  ## (original form) contains a reading which is marked as following the original, rather than being normalized or corrected. [3.4.2.  12. ]
  element orig {
    macro.paraContent,
    att.global.attributes,
    att.responsibility.attributes,
    empty
  }
gap =
  
  ## indicates a point where material has been omitted in a transcription, whether for editorial reasons described in the TEI header, as part of sampling practice, or because the material is illegible, invisible, or inaudible. [3.4.3. ]
  element gap {
    (model.descLike | model.certLike)*,
    att.global.attributes,
    att.editLike.attributes,
    
    ## gives the reason for omission. Sample values include sampling, inaudible, irrelevant, cancelled.
    attribute reason {
      list { data.word+ }
    }?,
    
    ## in the case of text omitted from the transcription because of deliberate deletion by an identifiable hand, indicates the hand which made the deletion.
    attribute hand { data.pointer }?,
    
    ## in the case of text omitted because of damage, categorizes the cause of the damage, if it can be identified.
    ## Sample values include: 1] rubbing; 2] mildew; 3] smoke
    attribute agent { data.enumerated }?,
    empty
  }
add =
  
  ## (addition) contains letters, words, or phrases inserted in the source text by an author, scribe, or a previous annotator or corrector. [3.4.3. ]
  element add {
    macro.paraContent,
    att.global.attributes,
    att.transcriptional.attributes,
    att.placement.attributes,
    att.typed.attributes,
    empty
  }
del =
  
  ## (deletion) contains a letter, word, or passage deleted, marked as deleted, or otherwise indicated as superfluous or spurious in the copy text by an author, scribe, or a previous annotator or corrector. [3.4.3. ]
  element del {
    macro.paraContent,
    att.global.attributes,
    att.transcriptional.attributes,
    att.typed.attributes,
    empty
  }
unclear =
  
  ## contains a word, phrase, or passage which cannot be transcribed with certainty because it is illegible or inaudible in the source. [11.3.3.1.  3.4.3. ]
  element unclear {
    macro.paraContent,
    att.global.attributes,
    att.editLike.attributes,
    
    ## indicates why the material is hard to transcribe.
    attribute reason {
      list { data.word+ }
    }?,
    
    ## Where the difficulty in transcription arises from action (partial deletion, etc.) assignable to an identifiable hand, signifies the hand responsible for the action.
    attribute hand { data.pointer }?,
    
    ## Where the difficulty in transcription arises from damage, categorizes the cause of the damage, if it can be identified.
    ## Sample values include: 1] rubbing; 2] mildew; 3] smoke
    attribute agent { data.enumerated }?,
    empty
  }
name =
  
  ## (name, proper noun) contains a proper noun or noun phrase. [3.5.1. ]
  element name {
    macro.phraseSeq,
    att.global.attributes,
    att.personal.attributes,
    att.datable.attributes,
    att.editLike.attributes,
    att.typed.attributes,
    empty
  }
rs =
  
  ## (referencing string) contains a general purpose name or referring string. [13.2.1.  3.5.1. ]
  element rs {
    macro.phraseSeq,
    att.global.attributes,
    att.naming.attributes,
    att.typed.attributes,
    att.responsibility.attributes,
    empty
  }
email =
  
  ## (electronic mail address) contains an email address identifying a location to which email messages can be delivered. [3.5.2. ]
  element email { macro.phraseSeq, att.global.attributes, empty }
address =
  
  ## contains a postal address, for example of a publisher, an organization, or an individual. [3.5.2.  2.2.4.  3.11.2.4. ]
  element address {
    (model.global*, (model.addrPart, model.global*)+),
    att.global.attributes,
    empty
  }
addrLine =
  
  ## (address line) contains one line of a postal address. [3.5.2.  2.2.4.  3.11.2.4. ]
  element addrLine { macro.phraseSeq, att.global.attributes, empty }
street =
  
  ## contains a full street address including any name or number identifying a building as well as the name of the street or route on which it is located. [3.5.2. ]
  element street { macro.phraseSeq, att.global.attributes, empty }
postCode =
  
  ## (postal code) contains a numerical or alphanumeric code used as part of a postal address to simplify sorting or delivery of mail. [3.5.2. ]
  element postCode { text, att.global.attributes, empty }
postBox =
  
  ## (postal box or post office box) contains a number or other identifier for some postal delivery point other than a street address. [3.5.2. ]
  element postBox { text, att.global.attributes, empty }
num =
  
  ## (number) contains a number, written in any form. [3.5.3. ]
  element num {
    macro.phraseSeq,
    att.global.attributes,
    att.ranging.attributes,
    
    ## indicates the type of numeric value.
    ## Suggested values include: 1] cardinal; 2] ordinal; 3] fraction; 4] percentage
    attribute type {
      
      ## absolute number, e.g. 21, 21.5
      "cardinal"
      | 
        ## ordinal number, e.g. 21st
        "ordinal"
      | 
        ## fraction, e.g. one half or three-quarters
        "fraction"
      | 
        ## a percentage
        "percentage"
      | xsd:Name
    }?,
    
    ## supplies the value of the number in standard form.
    attribute value { data.numeric }?,
    empty
  }
measure =
  
  ## contains a word or phrase referring to some quantity of an object or commodity, usually comprising a number, a unit, and a commodity name. [3.5.3. ]
  element measure {
    macro.phraseSeq,
    att.global.attributes,
    att.measurement.attributes,
    
    ## specifies the type of measurement in any convenient typology.
    attribute type { data.enumerated }?,
    empty
  }
measureGrp =
  
  ## (measure group) contains a group of dimensional specifications which relate to the same object, for example the height and width of a manuscript page. [10.3.4. ]
  element measureGrp {
    (text | model.gLike | model.measureLike)*,
    att.global.attributes,
    att.measurement.attributes,
    att.typed.attributes,
    empty
  }
date =
  
  ## contains a date in any format. [3.5.4.  2.2.4.  2.5.  3.11.2.4.  15.2.3.  13.3.6. ]
  element date {
    (text | model.gLike | model.phrase | model.global)*,
    att.global.attributes,
    att.datable.attributes,
    att.editLike.attributes,
    att.typed.attributes,
    empty
  }
time =
  
  ## contains a phrase defining a time of day in any format. [3.5.4. ]
  element time {
    (text | model.gLike | model.phrase | model.global)*,
    att.global.attributes,
    att.datable.attributes,
    att.editLike.attributes,
    att.typed.attributes,
    empty
  }
abbr =
  
  ## (abbreviation) contains an abbreviation of any sort. [3.5.5. ]
  element abbr {
    macro.phraseSeq,
    att.global.attributes,
    att.responsibility.attributes,
    att.typed.attribute.subtype,
    
    ## allows the encoder to classify the abbreviation according to some convenient typology.
    attribute type { data.enumerated }?,
    empty
  }
expan =
  
  ## (expansion) contains the expansion of an abbreviation. [3.5.5. ]
  element expan {
    macro.phraseSeq,
    att.global.attributes,
    att.editLike.attributes,
    empty
  }
ptr =
  
  ## (pointer) defines a pointer to another location. [3.6.  16.1. ]
  element ptr {
    empty
    >> sch:pattern [
         id = "tei_odds-ptr-ptrAtts-constraint-1"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:ptr"
           "\x{a}" ~
           "               "
           sch:report [
             test = "@target and @cRef"
             "Only one of the\x{a}" ~
             "attributes @target and @cRef may be supplied on "
             sch:name [ ]
             "."
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ],
    att.global.attributes,
    att.pointing.attributes,
    att.internetMedia.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    att.cReferencing.attributes,
    empty
  }
ref =
  
  ## (reference) defines a reference to another location, possibly modified by additional text or comment. [3.6.  16.1. ]
  element ref {
    macro.paraContent
    >> sch:pattern [
         id = "tei_odds-ref-refAtts-constraint-2"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:ref"
           "\x{a}" ~
           "               "
           sch:report [
             test = "@target and @cRef"
             "Only one of the\x{a}" ~
             "	attributes @target' and @cRef' may be supplied on "
             sch:name [ ]
             "\x{a}" ~
             "               "
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ],
    att.global.attributes,
    att.pointing.attributes,
    att.internetMedia.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    att.cReferencing.attributes,
    empty
  }
\list =
  
  ## contains any sequence of items organized as a list. [3.7. ]
  element list {
    ((model.divTop | model.global)*,
     ((item, model.global*)+
      | (headLabel?,
         headItem?,
         (label, model.global*, item, model.global*)+)),
     (model.divBottom, model.global*)*),
    att.global.attributes,
    att.sortable.attributes,
    att.typed.attribute.subtype,
    
    ## describes the nature of the items in the list.
    ## Suggested values include: 1] gloss; 2] index; 3] instructions; 4] litany; 5] syllogism
    attribute type {
      
      ## each list item glosses some term or concept, which is given by a label element preceding the list item.
      "gloss"
      | 
        ## each list item is an entry in an index such as the alphabetical topical index at the back of a print volume.
        "index"
      | 
        ## each list item is a step in a sequence of instructions, as in a recipe.
        "instructions"
      | 
        ## each list item is one of a sequence of petitions, supplications or invocations, typically in a religious ritual.
        "litany"
      | 
        ## each list item is part of an argument consisting of two or more propositions and a final conclusion derived from them.
        "syllogism"
      | xsd:Name
    }?,
    empty
  }
item =
  
  ## contains one component of a list. [3.7.  2.5. ]
  element item {
    macro.specialPara,
    att.global.attributes,
    att.sortable.attributes,
    empty
  }
label =
  
  ## contains any label or heading used to identify part of a text, typically but not exclusively in a list or glossary. [3.7. ]
  element label {
    macro.phraseSeq,
    att.global.attributes,
    att.typed.attributes,
    att.placement.attributes,
    empty
  }
head =
  
  ## (heading) contains any type of heading, for example the title of a section, or the heading of a list, glossary, manuscript description, etc. [4.2.1. ]
  element head {
    (text
     | lg
     | model.gLike
     | model.phrase
     | model.inter
     | model.lLike
     | model.global)*,
    att.global.attributes,
    att.typed.attributes,
    empty
  }
headLabel =
  
  ## (heading for list labels) contains the heading for the label or term column in a glossary list or similar structured list. [3.7. ]
  element headLabel { macro.phraseSeq, att.global.attributes, empty }
headItem =
  
  ## (heading for list items) contains the heading for the item or gloss column in a glossary list or similar structured list. [3.7. ]
  element headItem { macro.phraseSeq, att.global.attributes, empty }
note =
  
  ## contains a note or annotation. [3.8.1.  2.2.6.  3.11.2.8.  9.3.5.4. ]
  element note {
    macro.specialPara,
    att.global.attributes,
    att.placement.attributes,
    att.pointing.attributes,
    att.responsibility.attributes,
    att.typed.attributes,
    
    ## indicates whether the copy text shows the exact place of reference for the note.
    [ a:defaultValue = "true" ] attribute anchored { data.truthValue }?,
    
    ## points to the end of the span to which the note is attached, if the note is not embedded in the text at that point.
    attribute targetEnd {
      list { data.pointer+ }
    }?,
    empty
  }
index =
  
  ## (index entry) marks a location to be indexed for whatever purpose. [3.8.2. ]
  element index {
    (term, index?)*,
    att.global.attributes,
    att.spanning.attributes,
    
    ## a single word which follows the rules defining a legal XML name (see ), supplying a name to specify which index (of several) the index entry belongs to.
    attribute indexName { data.name }?,
    empty
  }
media =
  
  ## indicates the location of any form of external media such as an audio or video clip etc. [3.9. ]
  element media {
    model.descLike*,
    att.typed.attributes,
    att.global.attributes,
    att.media.attribute.width,
    att.media.attribute.height,
    att.media.attribute.scale,
    att.resourced.attributes,
    att.declaring.attributes,
    att.timed.attributes,
    
    ## (MIME media type) specifies the applicable multimedia internet mail extension (MIME) media type
    attribute mimeType {
      list { data.word+ }
    },
    empty
  }
graphic =
  
  ## indicates the location of an inline graphic, illustration, or figure. [3.9. ]
  element graphic {
    model.descLike*,
    att.global.attributes,
    att.media.attributes,
    att.resourced.attributes,
    att.declaring.attributes,
    empty
  }
binaryObject =
  
  ## provides encoded binary data representing an inline graphic, audio, video or other object. [3.9. ]
  element binaryObject {
    text,
    att.global.attributes,
    att.media.attributes,
    att.timed.attributes,
    att.typed.attributes,
    
    ## The encoding used to encode the binary data. If not specified, this is assumed to be Base64.
    attribute encoding {
      list { data.word+ }
    }?,
    empty
  }
milestone =
  
  ## marks a boundary point separating any kind of section of a text, typically but not necessarily indicating a point at which some part of a standard reference system changes, where the change is not represented by a structural element. [3.10.3. ]
  element milestone {
    empty,
    att.global.attributes,
    att.milestoneUnit.attributes,
    att.typed.attributes,
    att.edition.attributes,
    att.spanning.attributes,
    att.breaking.attributes,
    empty
  }
gb =
  
  ## (gathering begins) marks the point in a transcribed codex at which a new gathering or quire begins. [3.10.3. ]
  element gb {
    empty,
    att.global.attributes,
    att.typed.attributes,
    att.spanning.attributes,
    att.breaking.attributes,
    empty
  }
pb =
  
  ## (page break) marks the start of a new page in a paginated document. [3.10.3. ]
  element pb {
    empty,
    att.global.attributes,
    att.typed.attributes,
    att.edition.attributes,
    att.spanning.attributes,
    att.breaking.attributes,
    empty
  }
lb =
  
  ## (line break) marks the start of a new (typographic) line in some edition or version of a text. [3.10.3.  7.2.5. ]
  element lb {
    empty,
    att.global.attributes,
    att.typed.attributes,
    att.edition.attributes,
    att.spanning.attributes,
    att.breaking.attributes,
    empty
  }
cb =
  
  ## (column break) marks the beginning of a new column of a text on a multi-column page. [3.10.3. ]
  element cb {
    empty,
    att.global.attributes,
    att.typed.attributes,
    att.edition.attributes,
    att.spanning.attributes,
    att.breaking.attributes,
    empty
  }
analytic =
  
  ## (analytic level) contains bibliographic elements describing an item (e.g. an article or poem) published within a monograph or journal and not as an independent publication. [3.11.2.1. ]
  element analytic {
    (author
     | editor
     | respStmt
     | title
     | model.ptrLike
     | date
     | textLang
     | idno
     | availability)*,
    att.global.attributes,
    empty
  }
monogr =
  
  ## (monographic level) contains bibliographic elements describing an item (e.g. a book or journal) published as an independent item (i.e. as a separate physical object). [3.11.2.1. ]
  element monogr {
    ((((author | editor | meeting | respStmt),
       (author | editor | meeting | respStmt)*,
       title+,
       (model.ptrLike | idno | textLang | editor | respStmt)*)
      | ((title | model.ptrLike | idno)+,
         (textLang | author | editor | meeting | respStmt)*)
      | (authority, idno))?,
     availability*,
     model.noteLike*,
     (edition,
      (idno | model.ptrLike | editor | sponsor | funder | respStmt)*)*,
     imprint,
     (imprint | extent | biblScope)*),
    att.global.attributes,
    empty
  }
series =
  
  ## (series information) contains information about the series in which a book or other bibliographic item has appeared. [3.11.2.1. ]
  element series {
    (text
     | model.gLike
     | title
     | model.ptrLike
     | editor
     | respStmt
     | biblScope
     | idno
     | textLang
     | model.global
     | availability)*,
    att.global.attributes,
    empty
  }
author =
  
  ## in a bibliographic reference, contains the name(s) of an author, personal or corporate, of a work; for example in the same form as that provided by a recognized bibliographic name authority. [3.11.2.2.  2.2.1. ]
  element author {
    macro.phraseSeq, att.global.attributes, att.naming.attributes, empty
  }
editor =
  
  ## contains a secondary statement of responsibility for a bibliographic item, for example the name of an individual, institution or organization, (or of several such) acting as editor, compiler, translator, etc. [3.11.2.2. ]
  element editor {
    macro.phraseSeq, att.global.attributes, att.naming.attributes, empty
  }
respStmt =
  
  ## (statement of responsibility) supplies a statement of responsibility for the intellectual content of a text, edition, recording, or series, where the specialized elements for authors, editors, etc. do not suffice or do not apply. May also be used to encode information about individuals or organizations which have played a role in the production or distribution of a bibliographic work. [3.11.2.2.  2.2.1.  2.2.2.  2.2.5. ]
  element respStmt {
    ((resp+, model.nameLike.agent+) | (model.nameLike.agent+, resp+)),
    att.global.attributes,
    att.canonical.attributes,
    empty
  }
resp =
  
  ## (responsibility) contains a phrase describing the nature of a person's intellectual responsibility, or an organization's role in the production or distribution of a work. [3.11.2.2.  2.2.1.  2.2.2.  2.2.5. ]
  element resp {
    macro.phraseSeq.limited,
    att.global.attributes,
    att.canonical.attributes,
    att.datable.attributes,
    empty
  }
title =
  
  ## contains a title for any kind of work. [3.11.2.2.  2.2.1.  2.2.5. ]
  element title {
    macro.paraContent,
    att.global.attributes,
    att.canonical.attributes,
    att.typed.attribute.subtype,
    
    ## classifies the title according to some convenient typology.
    ## Sample values include: 1] main; 2] sub(subordinate) ; 3] alt(alternate) ; 4] short; 5] desc(descriptive) 
    attribute type { data.enumerated }?,
    
    ## indicates the bibliographic level for a title, that is, whether it identifies an article, book, journal, series, or unpublished material.
    attribute level {
      
      ## (analytic) the title applies to an analytic item, such as an article, poem, or other work published as part of a larger item.
      "a"
      | 
        ## (monographic) the title applies to a monograph such as a book or other item considered to be a distinct publication, including single volumes of multi-volume works
        "m"
      | 
        ## (journal) the title applies to any serial or periodical publication such as a journal, magazine, or newspaper
        "j"
      | 
        ## (series) the title applies to a series of otherwise distinct publications such as a collection
        "s"
      | 
        ## (unpublished) the title applies to any unpublished material (including theses and dissertations unless published by a commercial press)
        "u"
    }?,
    empty
  }
meeting =
  
  ## contains the formalized descriptive title for a meeting or conference, for use in a bibliographic description for an item derived from such a meeting, or as a heading or preamble to publications emanating from it. [3.11.2.2. ]
  element meeting {
    macro.limitedContent,
    att.global.attributes,
    att.canonical.attributes,
    empty
  }
imprint =
  
  ## groups information relating to the publication or distribution of a bibliographic item. [3.11.2.4. ]
  element imprint {
    ((classCode | catRef)*,
     ((model.imprintPart | model.dateLike), respStmt*, model.global*)+),
    att.global.attributes,
    empty
  }
publisher =
  
  ## provides the name of the organization responsible for the publication or distribution of a bibliographic item. [3.11.2.4.  2.2.4. ]
  element publisher { macro.phraseSeq, att.global.attributes, empty }
biblScope =
  
  ## (scope of bibliographic reference) defines the scope of a bibliographic reference, for example as a list of page numbers, or a named subdivision of a larger work. [3.11.2.5. ]
  element biblScope {
    macro.phraseSeq,
    att.global.attributes,
    att.citing.attributes,
    
    ## identifies the type of information conveyed by the element, e.g. columns, pages, volume.
    ## Suggested values include: 1] vol(volume) ; 2] issue; 3] pp(pages) ; 4] ll(lines) ; 5] chap(chapter) ; 6] part
    attribute type {
      
      ## (volume) the element contains a volume number.
      "vol"
      | 
        ## the element contains an issue number, or volume and issue numbers.
        "issue"
      | 
        ## (pages) the element contains a page number or page range.
        "pp"
      | 
        ## (lines) the element contains a line number or line range.
        "ll"
      | 
        ## (chapter) the element contains a chapter indication (number and/or title)
        "chap"
      | 
        ## the element identifies a part of a book or collection.
        "part"
      | xsd:Name
    }?,
    empty
  }
citedRange =
  
  ## (cited range) defines the range of cited content, often represented by pages or other units [3.11.2.5. ]
  element citedRange {
    macro.phraseSeq,
    att.global.attributes,
    att.pointing.attributes,
    att.citing.attributes,
    empty
  }
pubPlace =
  
  ## (publication place) contains the name of the place where a bibliographic item was published. [3.11.2.4. ]
  element pubPlace {
    macro.phraseSeq, att.global.attributes, att.naming.attributes, empty
  }
bibl =
  
  ## (bibliographic citation) contains a loosely-structured bibliographic citation of which the sub-components may or may not be explicitly tagged. [3.11.1.  2.2.7.  15.3.2. ]
  element bibl {
    (text
     | model.gLike
     | model.highlighted
     | model.pPart.data
     | model.pPart.edit
     | model.segLike
     | model.ptrLike
     | model.biblPart
     | model.global)*,
    att.global.attributes,
    att.declarable.attributes,
    att.typed.attributes,
    att.sortable.attributes,
    att.docStatus.attributes,
    empty
  }
biblStruct =
  
  ## (structured bibliographic citation) contains a structured bibliographic citation, in which only bibliographic sub-elements appear and in a specified order. [3.11.1.  2.2.7.  15.3.2. ]
  element biblStruct {
    (analytic*,
     (monogr, series*)+,
     (model.noteLike
      | idno
      | model.ptrLike
      | relatedItem
      | citedRange)*),
    att.global.attributes,
    att.declarable.attributes,
    att.typed.attributes,
    att.sortable.attributes,
    att.docStatus.attributes,
    empty
  }
listBibl =
  
  ## (citation list) contains a list of bibliographic citations of any kind. [3.11.1.  2.2.7.  15.3.2. ]
  element listBibl {
    (model.headLike*, (model.biblLike | model.milestoneLike)+, empty*),
    att.global.attributes,
    att.sortable.attributes,
    att.declarable.attributes,
    att.typed.attributes,
    empty
  }
relatedItem =
  
  ## contains or references some other bibliographic item which is related to the present one in some specified manner, for example as a constituent or alternative version of it. [3.11.2.7. ]
  element relatedItem {
    ((model.biblLike | model.ptrLike)?)
    >> sch:pattern [
         id = "tei_odds-relatedItem-targetorcontent1-constraint-3"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:relatedItem"
           "\x{a}" ~
           "               "
           sch:report [
             test = "@target and count( child::* ) > 0"
             "\x{a}" ~
             "If the @target attribute on "
             sch:name [ ]
             " is used, the\x{a}" ~
             "relatedItem element must be empty"
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ]
    >> sch:pattern [
         id = "tei_odds-relatedItem-targetorcontent1-constraint-6"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:relatedItem"
           "\x{a}" ~
           "               "
           sch:assert [
             test = "@target or child::*"
             "A relatedItem element should have either a 'target' attribute\x{a}" ~
             "        or a child element to indicate the related bibliographic item"
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ],
    att.global.attributes,
    att.typed.attributes,
    
    ## points to the related bibliographic element by means of an absolute or relative URI reference
    attribute target { data.pointer }?,
    empty
  }
l =
  
  ## (verse line) contains a single, possibly incomplete, line of verse. [3.12.1.  3.12.  7.2.5. ]
  element l {
    macro.paraContent,
    att.global.attributes,
    att.fragmentable.attributes,
    empty
  }
lg =
  
  ## (line group) contains one or more verse lines functioning as a formal unit, e.g. a stanza, refrain, verse paragraph, etc. [3.12.1.  3.12.  7.2.5. ]
  element lg {
    ((model.divTop | model.global)*,
     (model.lLike | model.stageLike | model.labelLike | lg),
     (model.lLike
      | model.stageLike
      | model.labelLike
      | model.global
      | lg)*,
     (model.divBottom, model.global*)*)
    >> sch:pattern [
         id = "tei_odds-lg-atleast1oflggapl-constraint-7"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:lg"
           "\x{a}" ~
           "               "
           sch:assert [
             test =
               "count(descendant::tei:lg|descendant::tei:l|descendant::tei:gap) > 0"
             "An lg element\x{a}" ~
             "        must contain at least one child l, lg or gap element."
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ],
    att.global.attributes,
    att.divLike.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    empty
  }
sp =
  
  ## (speech) contains an individual speech in a performance text, or a passage presented as such in a prose or verse text. [3.12.2.  3.12.  7.2.2. ]
  element sp {
    (model.global*,
     (speaker, model.global*)?,
     ((lg
       | model.lLike
       | model.pLike
       | model.listLike
       | model.stageLike
       | model.qLike),
      model.global*)+),
    att.global.attributes,
    att.ascribed.attributes,
    empty
  }
speaker =
  
  ## contains a specialized form of heading or label, giving the name of one or more speakers in a dramatic text or fragment. [3.12.2. ]
  element speaker { macro.phraseSeq, att.global.attributes, empty }
stage =
  
  ## (stage direction) contains any kind of stage direction within a dramatic text or fragment. [3.12.2.  3.12.  7.2.4. ]
  element stage {
    macro.specialPara,
    att.ascribed.attributes,
    att.global.attributes,
    att.placement.attributes,
    
    ## indicates the kind of stage direction.
    ## Suggested values include: 1] setting; 2] entrance; 3] exit; 4] business; 5] novelistic; 6] delivery; 7] modifier; 8] location; 9] mixed
    attribute type {
      
      ## describes a setting.
      "setting"
      | 
        ## describes an entrance.
        "entrance"
      | 
        ## describes an exit.
        "exit"
      | 
        ## describes stage business.
        "business"
      | 
        ## is a narrative, motivating stage direction.
        "novelistic"
      | 
        ## describes how a character speaks.
        "delivery"
      | 
        ## gives some detail about a character.
        "modifier"
      | 
        ## describes a location.
        "location"
      | 
        ## more than one of the above
        "mixed"
      | xsd:Name
    }?,
    empty
  }
divGen =
  
  ## (automatically generated text division) indicates the location at which a textual division generated automatically by a text-processing application is to appear. [3.8.2. ]
  element divGen {
    model.headLike*,
    att.global.attributes,
    
    ## specifies what type of generated text division (e.g. index, table of contents, etc.) is to appear.
    ## Sample values include: 1] index; 2] toc; 3] figlist; 4] tablist
    attribute type { data.enumerated }?,
    empty
  }
textLang =
  
  ## (text language) describes the languages and writing systems identified within the bibliographic work being described, rather than its description. [3.11.2.4.  10.6.6. ]
  element textLang {
    macro.phraseSeq,
    att.global.attributes,
    
    ## (main language) supplies a code which identifies the chief language used in the bibliographic work.
    attribute mainLang { data.language }?,
    
    ## (other languages) one or more codes identifying any other languages used in the bibliographic work.
    attribute otherLangs {
      list { data.language* }
    }?,
    empty
  }
att.patternReplacement.attributes =
  att.patternReplacement.attribute.matchPattern,
  att.patternReplacement.attribute.replacementPattern
att.patternReplacement.attribute.matchPattern =
  
  ## specifies a regular expression against which the values of other attributes can be matched.
  attribute matchPattern { data.pattern }
att.patternReplacement.attribute.replacementPattern =
  
  ## specifies a replacement pattern, that is, the skeleton of a relative or absolute URI containing references to groups in the matchPattern which, once subpattern substitution has been performed, complete the URI.
  attribute replacementPattern { data.replacement }
teiHeader =
  
  ## (TEI header) supplies the descriptive and declarative information making up an electronic title page for every TEI-conformant document. [2.1.1.  15.1. ]
  element teiHeader {
    (fileDesc, model.teiHeaderPart*, revisionDesc?),
    att.global.attributes,
    
    ## specifies the kind of document to which the header is attached, for example whether it is a corpus or individual text.
    ## Sample values include: 1] text; 2] corpus
    [ a:defaultValue = "text" ] attribute type { data.enumerated }?,
    empty
  }
fileDesc =
  
  ## (file description) contains a full bibliographic description of an electronic file. [2.2.  2.1.1. ]
  element fileDesc {
    ((titleStmt,
      editionStmt?,
      extent?,
      publicationStmt,
      seriesStmt?,
      notesStmt?),
     sourceDesc+),
    att.global.attributes,
    empty
  }
titleStmt =
  
  ## (title statement) groups information about the title of a work and those responsible for its content. [2.2.1.  2.2. ]
  element titleStmt {
    (title+, model.respLike*), att.global.attributes, empty
  }
sponsor =
  
  ## specifies the name of a sponsoring organization or institution. [2.2.1. ]
  element sponsor {
    macro.phraseSeq.limited,
    att.global.attributes,
    att.canonical.attributes,
    empty
  }
funder =
  
  ## (funding body) specifies the name of an individual, institution, or organization responsible for the funding of a project or text. [2.2.1. ]
  element funder {
    macro.phraseSeq.limited,
    att.global.attributes,
    att.canonical.attributes,
    empty
  }
principal =
  
  ## (principal researcher) supplies the name of the principal researcher responsible for the creation of an electronic text. [2.2.1. ]
  element principal {
    macro.phraseSeq.limited,
    att.global.attributes,
    att.canonical.attributes,
    empty
  }
editionStmt =
  
  ## (edition statement) groups information relating to one edition of a text. [2.2.2.  2.2. ]
  element editionStmt {
    (model.pLike+ | (edition, model.respLike*)),
    att.global.attributes,
    empty
  }
edition =
  
  ## describes the particularities of one edition of a text. [2.2.2. ]
  element edition { macro.phraseSeq, att.global.attributes, empty }
extent =
  
  ## describes the approximate size of a text stored on some carrier medium or of some other object, digital or non-digital, specified in any convenient units. [2.2.3.  2.2.  3.11.2.4.  10.7.1. ]
  element extent { macro.phraseSeq, att.global.attributes, empty }
publicationStmt =
  
  ## (publication statement) groups information concerning the publication or distribution of an electronic or other text. [2.2.4.  2.2. ]
  element publicationStmt {
    ((model.publicationStmtPart.agency,
      model.publicationStmtPart.detail*)+
     | model.pLike+),
    att.global.attributes,
    empty
  }
distributor =
  
  ## supplies the name of a person or other agency responsible for the distribution of a text. [2.2.4. ]
  element distributor { macro.phraseSeq, att.global.attributes, empty }
authority =
  
  ## (release authority) supplies the name of a person or other agency responsible for making a work available, other than a publisher or distributor. [2.2.4. ]
  element authority {
    macro.phraseSeq.limited, att.global.attributes, empty
  }
idno =
  
  ## (identifier) supplies any form of identifier used to identify some object, such as a bibliographic item, a person, a title, an organization, etc. in a standardized way. [2.2.4.  2.2.5.  3.11.2.4. ]
  element idno {
    (text | model.gLike | idno)*,
    att.global.attributes,
    att.sortable.attributes,
    
    ## categorizes the identifier, for example as an ISBN, Social Security number, etc.
    attribute type { data.enumerated }?,
    empty
  }
availability =
  
  ## supplies information about the availability of a text, for example any restrictions on its use or distribution, its copyright status, any licence applying to it, etc. [2.2.4. ]
  element availability {
    (model.availabilityPart | model.pLike)+,
    att.global.attributes,
    att.declarable.attributes,
    
    ## supplies a code identifying the current availability of the text.
    [ a:defaultValue = "unknown" ]
    attribute status {
      
      ## the text is freely available.
      "free"
      | 
        ## the status of the text is unknown.
        "unknown"
      | 
        ## the text is not freely available.
        "restricted"
    }?,
    empty
  }
licence =
  
  ## contains information about a licence or other legal agreement applicable to the text. [2.2.4. ]
  element licence {
    macro.specialPara,
    att.global.attributes,
    att.pointing.attributes,
    att.datable.attributes,
    empty
  }
seriesStmt =
  
  ## (series statement) groups information about the series, if any, to which a publication belongs. [2.2.5.  2.2. ]
  element seriesStmt {
    (model.pLike+
     | (title+, (editor | respStmt)*, (idno | biblScope)*)),
    att.global.attributes,
    empty
  }
notesStmt =
  
  ## (notes statement) collects together any notes providing information about a text additional to that recorded in other parts of the bibliographic description. [2.2.6.  2.2. ]
  element notesStmt {
    (model.noteLike | relatedItem)+, att.global.attributes, empty
  }
sourceDesc =
  
  ## (source description) describes the source from which an electronic text was derived or generated, typically a bibliographic description in the case of a digitized text, or a phrase such as "born digital" for a text which has no previous existence. [2.2.7. ]
  element sourceDesc {
    (model.pLike+
     | (model.biblLike | model.sourceDescPart | model.listLike)+),
    att.global.attributes,
    att.declarable.attributes,
    empty
  }
biblFull =
  
  ## (fully-structured bibliographic citation) contains a fully-structured bibliographic citation, in which all components of the TEI file description are present. [3.11.1.  2.2.  2.2.7.  15.3.2. ]
  element biblFull {
    ((titleStmt,
      editionStmt?,
      extent?,
      publicationStmt,
      seriesStmt?,
      notesStmt?),
     sourceDesc*),
    att.global.attributes,
    att.declarable.attributes,
    att.sortable.attributes,
    att.docStatus.attributes,
    empty
  }
encodingDesc =
  
  ## (encoding description) documents the relationship between an electronic text and the source or sources from which it was derived. [2.3.  2.1.1. ]
  element encodingDesc {
    (model.encodingDescPart | model.pLike)+,
    att.global.attributes,
    empty
  }
projectDesc =
  
  ## (project description) describes in detail the aim or purpose for which an electronic file was encoded, together with any other relevant information concerning the process by which it was assembled or collected. [2.3.1.  2.3.  15.3.2. ]
  element projectDesc {
    model.pLike+,
    att.global.attributes,
    att.declarable.attributes,
    empty
  }
samplingDecl =
  
  ## (sampling declaration) contains a prose description of the rationale and methods used in sampling texts in the creation of a corpus or collection. [2.3.2.  2.3.  15.3.2. ]
  element samplingDecl {
    model.pLike+,
    att.global.attributes,
    att.declarable.attributes,
    empty
  }
editorialDecl =
  
  ## (editorial practice declaration) provides details of editorial principles and practices applied during the encoding of a text. [2.3.3.  2.3.  15.3.2. ]
  element editorialDecl {
    (model.pLike | model.editorialDeclPart)+,
    att.global.attributes,
    att.declarable.attributes,
    empty
  }
correction =
  
  ## (correction principles) states how and under what circumstances corrections have been made in the text. [2.3.3.  15.3.2. ]
  element correction {
    model.pLike+,
    att.global.attributes,
    att.declarable.attributes,
    
    ## indicates the degree of correction applied to the text.
    [ a:defaultValue = "unknown" ]
    attribute status {
      
      ## the text has been thoroughly checked and proofread.
      "high"
      | 
        ## the text has been checked at least once.
        "medium"
      | 
        ## the text has not been checked.
        "low"
      | 
        ## the correction status of the text is unknown.
        "unknown"
    }?,
    
    ## indicates the method adopted to indicate corrections within the text.
    [ a:defaultValue = "silent" ]
    attribute method {
      
      ## corrections have been made silently
      "silent"
      | 
        ## corrections have been represented using markup
        "markup"
    }?,
    empty
  }
normalization =
  
  ## indicates the extent of normalization or regularization of the original source carried out in converting it to electronic form. [2.3.3.  15.3.2. ]
  element normalization {
    model.pLike+,
    att.global.attributes,
    att.declarable.attributes,
    
    ## indicates a bibliographic description or other resource documenting the principles underlying the normalization carried out.
    attribute source { data.pointer }?,
    
    ## indicates the method adopted to indicate normalizations within the text.
    [ a:defaultValue = "silent" ]
    attribute method {
      
      ## normalization made silently
      "silent"
      | 
        ## normalization represented using markup
        "markup"
    }?,
    empty
  }
quotation =
  
  ## specifies editorial practice adopted with respect to quotation marks in the original. [2.3.3.  15.3.2. ]
  element quotation {
    (model.pLike*)
    >> sch:pattern [
         id = "tei_odds-quotation-quotationContents-constraint-4"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:quotation"
           "\x{a}" ~
           "               "
           sch:report [
             test = "not(@marks) and not (tei:p)"
             "\x{a}" ~
             "On "
             sch:name [ ]
             ", either the @marks attribute should be used, or a paragraph of description provided"
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ],
    att.global.attributes,
    att.declarable.attributes,
    
    ## (quotation marks) indicates whether or not quotation marks have been retained as content within the text.
    attribute marks {
      
      ## no quotation marks have been retained
      "none"
      | 
        ## some quotation marks have been retained
        "some"
      | 
        ## all quotation marks have been retained
        "all"
    }?,
    empty
  }
hyphenation =
  
  ## summarizes the way in which hyphenation in a source text has been treated in an encoded version of it. [2.3.3.  15.3.2. ]
  element hyphenation {
    model.pLike+,
    att.global.attributes,
    att.declarable.attributes,
    
    ## (end-of-line) indicates whether or not end-of-line hyphenation has been retained in a text.
    [ a:defaultValue = "some" ]
    attribute eol {
      
      ## all end-of-line hyphenation has been retained, even though the lineation of the original may not have been.
      "all"
      | 
        ## end-of-line hyphenation has been retained in some cases.
        "some"
      | 
        ## all soft end-of-line hyphenation has been removed: any remaining end-of-line hyphenation should be retained.
        "hard"
      | 
        ## all end-of-line hyphenation has been removed: any remaining hyphenation occurred within the line.
        "none"
    }?,
    empty
  }
segmentation =
  
  ## describes the principles according to which the text has been segmented, for example into sentences, tone-units, graphemic strata, etc. [2.3.3.  15.3.2. ]
  element segmentation {
    model.pLike+,
    att.global.attributes,
    att.declarable.attributes,
    empty
  }
stdVals =
  
  ## (standard values) specifies the format used when standardized date or number values are supplied. [2.3.3.  15.3.2. ]
  element stdVals {
    model.pLike+,
    att.global.attributes,
    att.declarable.attributes,
    empty
  }
interpretation =
  
  ## describes the scope of any analytic or interpretive information added to the text in addition to the transcription. [2.3.3. ]
  element interpretation {
    model.pLike+,
    att.global.attributes,
    att.declarable.attributes,
    empty
  }
punctuation =
  
  ## specifies editorial practice adopted with respect to punctuation marks in the original. [2.3.3.  3.2. ]
  element punctuation {
    model.pLike*,
    att.declarable.attributes,
    att.global.attributes,
    
    ## indicates whether or not punctation marks have been retained as content within the text.
    attribute marks {
      
      ## no punctuation marks have been retained
      "none"
      | 
        ## some punctuation marks have been retained
        "some"
      | 
        ## all punctuation marks have been retained
        "all"
    }?,
    
    ## indicates whether punctation marks have been captured inside or outside of an adjacent element.
    attribute placement {
      
      ## punctuation marks are captured inside adjacent elements
      "internal"
      | 
        ## punctuation marks are captured outside adjacent elements
        "external"
    }?,
    empty
  }
tagsDecl =
  
  ## (tagging declaration) provides detailed information about the tagging applied to a document. [2.3.4.  2.3. ]
  element tagsDecl {
    (rendition*, \namespace*), att.global.attributes, empty
  }
tagUsage =
  
  ## supplies information about the usage of a specific element within a text. [2.3.4. ]
  element tagUsage {
    macro.limitedContent,
    att.global.attributes,
    
    ## (generic identifier) specifies the name (generic identifier) of the element indicated by the tag, within the namespace indicated by the parent namespace element.
    attribute gi { data.name },
    
    ## specifies the number of occurrences of this element within the text.
    attribute occurs { data.count }?,
    
    ## (with unique identifier) specifies the number of occurrences of this element within the text which bear a distinct value for the global xml:id attribute.
    attribute withId { data.count }?,
    
    ## specifies the identifier of a rendition element which defines how this element was rendered in the source text.
    attribute render {
      list { data.pointer+ }
    }?,
    empty
  }
\namespace =
  
  ## supplies the formal name of the namespace to which the elements documented by its children belong. [2.3.4. ]
  element namespace {
    tagUsage+,
    att.global.attributes,
    
    ## specifies the full formal name of the namespace concerned.
    attribute name { data.namespace },
    empty
  }
rendition =
  
  ## supplies information about the rendition or appearance of one or more elements in the source text. [2.3.4. ]
  element rendition {
    macro.limitedContent,
    att.global.attributes,
    att.styleDef.attributes,
    
    ## where CSS is used, provides a way of defining pseudo-elements, that is, styling rules applicable to specific sub-portions of an element.
    ## Sample values include: 1] first-line; 2] first-letter; 3] before; 4] after
    attribute scope { data.enumerated }?,
    empty
  }
styleDefDecl =
  
  ## (style definition language declaration) specifies the name of the formal language in which style or renditional information is supplied elsewhere in the document. The specific version of the scheme may also be supplied. [2.3.5. ]
  element styleDefDecl {
    model.pLike*,
    att.global.attributes,
    att.declarable.attributes,
    att.styleDef.attributes,
    empty
  }
refsDecl =
  
  ## (references declaration) specifies how canonical references are constructed for this text. [2.3.6.3.  2.3.  2.3.6. ]
  element refsDecl {
    (model.pLike+ | cRefPattern+ | refState+),
    att.global.attributes,
    att.declarable.attributes,
    empty
  }
cRefPattern =
  
  ## (canonical reference pattern) specifies an expression and replacement pattern for transforming a canonical reference into a URI. [2.3.6.3.  2.3.6.  2.3.6.2. ]
  element cRefPattern {
    model.pLike*,
    att.global.attributes,
    att.patternReplacement.attributes,
    empty
  }
prefixDef =
  
  ## (prefixing scheme used in data.pointer values) defines a prefixing scheme used in data.pointer values, showing how abbreviated URIs using the scheme may be expanded into full URIs. [16.2.3. ]
  element prefixDef {
    model.pLike*,
    att.global.attributes,
    att.patternReplacement.attributes,
    
    ## supplies a name which functions as the prefix for an abbreviated pointing scheme such as a private URI scheme. The prefix constitutes the text preceding the first colon.
    attribute ident { data.name },
    empty
  }
listPrefixDef =
  
  ## (list of prefix definitions) contains a list of definitions of prefixing schemes used in data.pointer values, showing how abbreviated URIs using each scheme may be expanded into full URIs. [16.2.3. ]
  element listPrefixDef {
    (prefixDef | listPrefixDef)+, att.global.attributes, empty
  }
refState =
  
  ## (reference state) specifies one component of a canonical reference defined by the milestone method. [2.3.6.3.  2.3.6. ]
  element refState {
    empty,
    att.global.attributes,
    att.milestoneUnit.attributes,
    att.edition.attributes,
    
    ## specifies the fixed length of the reference component.
    attribute length { data.count }?,
    
    ## (delimiter) supplies a delimiting string following the reference component.
    attribute delim { data.text }?,
    empty
  }
classDecl =
  
  ## (classification declarations) contains one or more taxonomies defining any classificatory codes used elsewhere in the text. [2.3.7.  2.3. ]
  element classDecl { taxonomy+, att.global.attributes, empty }
taxonomy =
  
  ## defines a typology either implicitly, by means of a bibliographic citation, or explicitly by a structured taxonomy. [2.3.7. ]
  element taxonomy {
    ((model.glossLike | model.descLike)*
     | category+
     | (model.biblLike, category*)),
    att.global.attributes,
    empty
  }
category =
  
  ## contains an individual descriptive category, possibly nested within a superordinate category, within a user-defined taxonomy. [2.3.7. ]
  element category {
    ((catDesc+ | (model.descLike | model.glossLike)*),
     category*),
    att.global.attributes,
    empty
  }
catDesc =
  
  ## (category description) describes some category within a taxonomy or text typology, either in the form of a brief prose description or in terms of the situational parameters used by the TEI formal textDesc. [2.3.7. ]
  element catDesc {
    (text | model.limitedPhrase | model.catDescPart)*,
    att.global.attributes,
    empty
  }
geoDecl =
  
  ## (geographic coordinates declaration) documents the notation and the datum used for geographic coordinates expressed as content of the geo element elsewhere within the document. [2.3.8. ]
  element geoDecl {
    macro.phraseSeq,
    att.global.attributes,
    att.declarable.attributes,
    
    ## supplies a commonly used code name for the datum employed.
    ## Suggested values include: 1] WGS84(World Geodetic System) ; 2] MGRS(Military Grid Reference System) ; 3] OSGB36(ordnance survey great britain) ; 4] ED50(European Datum coordinate system) 
    [ a:defaultValue = "WGS84" ]
    attribute datum {
      
      ## (World Geodetic System) a pair of numbers to be interpreted as latitude followed by longitude according to the World Geodetic System.
      "WGS84"
      | 
        ## (Military Grid Reference System) the values supplied are geospatial entity object codes, based on
        "MGRS"
      | 
        ## (ordnance survey great britain) the value supplied is to be interpreted as a British National Grid Reference.
        "OSGB36"
      | 
        ## (European Datum coordinate system) the value supplied is to be interpreted as latitude followed by longitude according to the European Datum coordinate system.
        "ED50"
      | xsd:Name
    }?,
    empty
  }
appInfo =
  
  ## (application information) records information about an application which has edited the TEI file. [2.3.10. ]
  element appInfo {
    model.applicationLike+, att.global.attributes, empty
  }
application =
  
  ## provides information about an application which has acted upon the document. [2.3.10. ]
  element application {
    (model.labelLike+, (model.ptrLike* | model.pLike*)),
    att.global.attributes,
    att.typed.attributes,
    att.datable.attributes,
    
    ## supplies an identifier for the application, independent of its version number or display name.
    attribute ident { data.name },
    
    ## supplies a version number for the application, independent of its identifier or display name.
    attribute version { data.versionNumber },
    empty
  }
profileDesc =
  
  ## (text-profile description) provides a detailed description of non-bibliographic aspects of a text, specifically the languages and sublanguages used, the situation in which it was produced, the participants and their setting. [2.4.  2.1.1. ]
  element profileDesc {
    model.profileDescPart*, att.global.attributes, empty
  }
abstract =
  
  ## contains a summary or formal abstract prefixed to an existing source document by the encoder. [2.4.4. ]
  element abstract {
    (model.pLike | model.listLike)+,
    att.global.attributes,
    att.responsibility.attributes,
    empty
  }
creation =
  
  ## contains information about the creation of a text. [2.4.1.  2.4. ]
  element creation {
    (text | model.limitedPhrase | listChange)*,
    att.global.attributes,
    att.datable.attributes,
    empty
  }
langUsage =
  
  ## (language usage) describes the languages, sublanguages, registers, dialects, etc. represented within a text. [2.4.2.  2.4.  15.3.2. ]
  element langUsage {
    language+, att.global.attributes, att.declarable.attributes, empty
  }
language =
  
  ## characterizes a single language or sublanguage used within a text. [2.4.2. ]
  element language {
    macro.phraseSeq.limited,
    att.global.attributes,
    
    ## (identifier) Supplies a language code constructed as defined in BCP 47 which is used to identify the language documented by this element, and which is referenced by the global xml:lang attribute.
    attribute ident { data.language },
    
    ## specifies the approximate percentage (by volume) of the text which uses this language.
    attribute usage {
      xsd:nonNegativeInteger { maxInclusive = "100" }
    }?,
    empty
  }
textClass =
  
  ## (text classification) groups information which describes the nature or topic of a text in terms of a standard classification scheme, thesaurus, etc. [2.4.3. ]
  element textClass {
    (classCode | catRef | keywords)*,
    att.global.attributes,
    att.declarable.attributes,
    empty
  }
keywords =
  
  ## contains a list of keywords or phrases identifying the topic or nature of a text. [2.4.3. ]
  element keywords {
    (term+ | \list),
    att.global.attributes,
    
    ## identifies the controlled vocabulary within which the set of keywords concerned is defined identifies the classification scheme within which the set of categories concerned is defined, for example by a taxonomy element, or by some other resource.
    attribute scheme { data.pointer }?,
    empty
  }
classCode =
  
  ## (classification code) contains the classification code used for this text in some standard classification system. [2.4.3. ]
  element classCode {
    macro.phraseSeq.limited,
    att.global.attributes,
    
    ## identifies the classification system in use, as defined by for example by a taxonomy element, or some other resource..
    attribute scheme { data.pointer },
    empty
  }
catRef =
  
  ## (category reference) specifies one or more defined categories within some taxonomy or text typology. [2.4.3. ]
  element catRef {
    empty,
    att.global.attributes,
    att.pointing.attributes,
    
    ## identifies the classification scheme within which the set of categories concerned is defined, for example by a taxonomy element, or by some other resource.
    attribute scheme { data.pointer }?,
    empty
  }
calendarDesc =
  
  ## (calendar description) contains a description of the calendar system used in any dating expression found in the text. [2.4.  2.4.5. ]
  element calendarDesc { calendar+, att.global.attributes, empty }
calendar =
  
  ## describes a calendar or dating system used in a dating formula in the text. [2.4.5. ]
  element calendar {
    model.pLike+, att.global.attributes, att.pointing.attributes, empty
  }
revisionDesc =
  
  ## (revision description) summarizes the revision history for a file. [2.5.  2.1.1. ]
  element revisionDesc {
    (\list | listChange | change+),
    att.global.attributes,
    att.docStatus.attributes,
    empty
  }
change =
  
  ## documents a change or set of changes made during the production of a source document, or during the revision of an electronic file. [2.5.  2.4.1.  11.7. ]
  element change {
    macro.specialPara,
    att.ascribed.attributes,
    att.datable.attributes,
    att.docStatus.attributes,
    att.global.attributes,
    att.typed.attributes,
    
    ## points to one or more elements that belong to this change.
    attribute target {
      list { data.pointer+ }
    }?,
    empty
  }
listChange =
  
  ## groups a number of change descriptions associated with either the creation of a source text or the revision of an encoded text. [2.5.  11.7. ]
  element listChange {
    (listChange | change)+,
    att.global.attributes,
    att.sortable.attributes,
    
    ## indicates whether the ordering of its child change elements is to be considered significant or not
    [ a:defaultValue = "true" ] attribute ordered { data.truthValue }?,
    empty
  }
g =
  
  ## (character or glyph) represents a glyph, or a non-standard character. [5. ]
  element g {
    text,
    att.global.attributes,
    att.typed.attributes,
    
    ## points to a description of the character or glyph intended.
    attribute ref { data.pointer }?,
    empty
  }
char =
  
  ## (character) provides descriptive information about a character. [5.2. ]
  element char {
    (charName?,
     model.descLike*,
     charProp*,
     mapping*,
     figure*,
     model.graphicLike*,
     model.noteLike*),
    att.global.attributes,
    empty
  }
charName =
  
  ## (character name) contains the name of a character, expressed following Unicode conventions. [5.2. ]
  element charName { text, att.global.attributes, empty }
charProp =
  
  ## (character property) provides a name and value for some property of the parent character or glyph. [5.2. ]
  element charProp {
    ((unicodeName | localName), value),
    att.global.attributes,
    att.typed.attributes,
    empty
  }
charDecl =
  
  ## (character declarations) provides information about nonstandard characters and glyphs. [5.2. ]
  element charDecl {
    (desc?, (char | glyph)+),
    att.global.attributes,
    empty
  }
glyph =
  
  ## (character glyph) provides descriptive information about a character glyph. [5.2. ]
  element glyph {
    (glyphName?,
     model.descLike*,
     charProp*,
     mapping*,
     figure*,
     model.graphicLike*,
     model.noteLike*),
    att.global.attributes,
    empty
  }
glyphName =
  
  ## (character glyph name) contains the name of a glyph, expressed following Unicode conventions for character names. [5.2. ]
  element glyphName { text, att.global.attributes, empty }
localName =
  
  ## (locally-defined property name) contains a locally defined name for some property. [5.2.1. ]
  element localName { text, att.global.attributes, empty }
mapping =
  
  ## (character mapping) contains one or more characters which are related to the parent character or glyph in some respect, as specified by the type attribute. [5.2. ]
  element mapping {
    macro.xtext, att.global.attributes, att.typed.attributes, empty
  }
unicodeName =
  
  ## (unicode property name) contains the name of a registered Unicode normative or informative property. [5.2.1. ]
  element unicodeName {
    text,
    att.global.attributes,
    
    ## specifies the version number of the Unicode Standard in which this property name is defined.
    attribute version { data.version }?,
    empty
  }
value =
  
  ## contains a single value for some property, attribute, or other analysis. [5.2.1. ]
  element value { macro.xtext, att.global.attributes, empty }
TEI =
  
  ## (TEI document) contains a single TEI-conformant document, comprising a TEI header and a text, either in isolation or as part of a teiCorpus element. [4.  15.1. ]
  element TEI {
    (teiHeader,
     ((model.resourceLike+, \text?) | \text))
    >> sch:ns [ prefix = "tei" uri = "http://www.tei-c.org/ns/1.0" ]
    >> sch:ns [ prefix = "xs" uri = "http://www.w3.org/2001/XMLSchema" ]
    >> sch:ns [
         prefix = "rng"
         uri = "http://relaxng.org/ns/structure/1.0"
       ],
    att.global.attributes,
    
    ## specifies the major version number of the TEI Guidelines against which this document is valid.
    attribute version { data.version }?,
    empty
  }
\text =
  
  ## contains a single text of any kind, whether unitary or composite, for example a poem or drama, a collection of essays, a novel, a dictionary, or a corpus sample. [4.  15.1. ]
  element text {
    (model.global*,
     (front, model.global*)?,
     (body | group),
     model.global*,
     (back, model.global*)?),
    att.global.attributes,
    att.declaring.attributes,
    att.typed.attributes,
    empty
  }
body =
  
  ## (text body) contains the whole body of a single unitary text, excluding any front or back matter. [4. ]
  element body {
    (model.global*,
     (model.divTop, (model.global | model.divTop)*)?,
     (model.divGenLike, (model.global | model.divGenLike)*)?,
     ((model.divLike, (model.global | model.divGenLike)*)+
      | (model.div1Like, (model.global | model.divGenLike)*)+
      | ((model.common, model.global*)+,
         ((model.divLike, (model.global | model.divGenLike)*)+
          | (model.div1Like, (model.global | model.divGenLike)*)+)?)),
     (model.divBottom, model.global*)*),
    att.global.attributes,
    att.declaring.attributes,
    empty
  }
group =
  
  ## contains the body of a composite text, grouping together a sequence of distinct texts (or groups of such texts) which are regarded as a unit for some purpose, for example the collected works of an author, a sequence of prose essays, etc. [4.  4.3.1.  15.1. ]
  element group {
    ((model.divTop | model.global)*,
     ((\text | group), (\text | group | model.global)*),
     model.divBottom*),
    att.global.attributes,
    att.declaring.attributes,
    att.typed.attributes,
    empty
  }
floatingText =
  
  ## contains a single text of any kind, whether unitary or composite, which interrupts the text containing it at any point and after which the surrounding text resumes. [4.3.2. ]
  element floatingText {
    (model.global*,
     (front, model.global*)?,
     (body | group),
     model.global*,
     (back, model.global*)?),
    att.global.attributes,
    att.declaring.attributes,
    att.typed.attributes,
    empty
  }
\div =
  
  ## (text division) contains a subdivision of the front, body, or back of a text. [4.1. ]
  element div {
    ((model.divTop | model.global)*,
     ((((model.divLike | model.divGenLike), model.global*)+
       | ((model.common, model.global*)+,
          ((model.divLike | model.divGenLike), model.global*)*)),
      (model.divBottom, model.global*)*)?),
    att.global.attributes,
    att.divLike.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    empty
  }
div1 =
  
  ## (level-1 text division) contains a first-level subdivision of the front, body, or back of a text. [4.1.2. ]
  element div1 {
    ((model.divTop | model.global)*,
     ((((model.div2Like | model.divGenLike), model.global*)+
       | ((model.common, model.global*)+,
          ((model.div2Like | model.divGenLike), model.global*)*)),
      (model.divBottom, model.global*)*)?),
    att.global.attributes,
    att.divLike.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    empty
  }
div2 =
  
  ## (level-2 text division) contains a second-level subdivision of the front, body, or back of a text. [4.1.2. ]
  element div2 {
    ((model.divTop | model.global)*,
     ((((model.div3Like | model.divGenLike), model.global*)+
       | ((model.common, model.global*)+,
          ((model.div3Like | model.divGenLike), model.global*)*)),
      (model.divBottom, model.global*)*)?),
    att.global.attributes,
    att.divLike.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    empty
  }
div3 =
  
  ## (level-3 text division) contains a third-level subdivision of the front, body, or back of a text. [4.1.2. ]
  element div3 {
    ((model.divTop | model.global)*,
     ((((model.div4Like | model.divGenLike), model.global*)+
       | ((model.common, model.global*)+,
          ((model.div4Like | model.divGenLike), model.global*)*)),
      (model.divBottom, model.global*)*)?),
    att.global.attributes,
    att.divLike.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    empty
  }
div4 =
  
  ## (level-4 text division) contains a fourth-level subdivision of the front, body, or back of a text. [4.1.2. ]
  element div4 {
    ((model.divTop | model.global)*,
     ((((model.div5Like | model.divGenLike), model.global*)+
       | ((model.common, model.global*)+,
          ((model.div5Like | model.divGenLike), model.global*)*)),
      (model.divBottom, model.global*)*)?),
    att.global.attributes,
    att.divLike.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    empty
  }
div5 =
  
  ## (level-5 text division) contains a fifth-level subdivision of the front, body, or back of a text. [4.1.2. ]
  element div5 {
    ((model.divTop | model.global)*,
     ((((model.div6Like | model.divGenLike), model.global*)+
       | ((model.common, model.global*)+,
          ((model.div6Like | model.divGenLike), model.global*)*)),
      (model.divBottom, model.global*)*)?),
    att.global.attributes,
    att.divLike.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    empty
  }
div6 =
  
  ## (level-6 text division) contains a sixth-level subdivision of the front, body, or back of a text. [4.1.2. ]
  element div6 {
    ((model.divTop | model.global)*,
     ((((model.div7Like | model.divGenLike), model.global*)+
       | ((model.common, model.global*)+,
          ((model.div7Like | model.divGenLike), model.global*)*)),
      (model.divBottom, model.global*)*)?),
    att.global.attributes,
    att.divLike.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    empty
  }
div7 =
  
  ## (level-7 text division) contains the smallest possible subdivision of the front, body or back of a text, larger than a paragraph. [4.1.2. ]
  element div7 {
    ((model.divTop | model.global)*,
     ((model.common, model.global*)+,
      (model.divBottom, model.global*)*)?),
    att.global.attributes,
    att.divLike.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    empty
  }
trailer =
  
  ## contains a closing title or footer appearing at the end of a division of a text. [4.2.4.  4.2. ]
  element trailer {
    (text
     | lg
     | model.gLike
     | model.phrase
     | model.inter
     | model.lLike
     | model.global)*,
    att.global.attributes,
    att.typed.attributes,
    empty
  }
byline =
  
  ## contains the primary statement of responsibility given for a work on its title page or at the head or end of the work. [4.2.2.  4.5. ]
  element byline {
    (text | model.gLike | model.phrase | docAuthor | model.global)*,
    att.global.attributes,
    empty
  }
dateline =
  
  ## contains a brief description of the place, date, time, etc. of production of a letter, newspaper story, or other work, prefixed or suffixed to it as a kind of heading or trailer. [4.2.2. ]
  element dateline {
    (text | model.gLike | model.phrase | model.global | docDate)*,
    att.global.attributes,
    empty
  }
argument =
  
  ## contains a formal list or prose description of the topics addressed by a subdivision of a text. [4.2.  4.6. ]
  element argument {
    ((model.global | model.headLike)*, (model.common, model.global*)+),
    att.global.attributes,
    empty
  }
epigraph =
  
  ## contains a quotation, anonymous or attributed, appearing at the start or end of a section or on a title page. [4.2.3.  4.2.  4.6. ]
  element epigraph {
    (model.common | model.global)*, att.global.attributes, empty
  }
opener =
  
  ## groups together dateline, byline, salutation, and similar phrases appearing as a preliminary group at the start of a division, especially of a letter. [4.2. ]
  element opener {
    (text
     | model.gLike
     | model.phrase
     | argument
     | byline
     | dateline
     | epigraph
     | salute
     | signed
     | model.global)*,
    att.global.attributes,
    empty
  }
closer =
  
  ## groups together salutations, datelines, and similar phrases appearing as a final group at the end of a division, especially of a letter. [4.2.2.  4.2. ]
  element closer {
    (text
     | model.gLike
     | signed
     | dateline
     | salute
     | model.phrase
     | model.global)*,
    att.global.attributes,
    empty
  }
salute =
  
  ## (salutation) contains a salutation or greeting prefixed to a foreword, dedicatory epistle, or other division of a text, or the salutation in the closing of a letter, preface, etc. [4.2.2. ]
  element salute { macro.paraContent, att.global.attributes, empty }
signed =
  
  ## (signature) contains the closing salutation, etc., appended to a foreword, dedicatory epistle, or other division of a text. [4.2.2. ]
  element signed { macro.paraContent, att.global.attributes, empty }
postscript =
  
  ## contains a postscript, e.g. to a letter. [4.2. ]
  element postscript {
    ((model.global | model.divTopPart)*,
     model.common,
     (model.global | model.common)*,
     (model.divBottomPart, model.global*)*),
    att.global.attributes,
    empty
  }
titlePage =
  
  ## (title page) contains the title page of a text, appearing within the front or back matter. [4.6. ]
  element titlePage {
    (model.global*,
     model.titlepagePart,
     (model.titlepagePart | model.global)*),
    att.global.attributes,
    
    ## classifies the title page according to any convenient typology.
    attribute type { data.enumerated }?,
    empty
  }
docTitle =
  
  ## (document title) contains the title of a document, including all its constituents, as given on a title page. [4.6. ]
  element docTitle {
    (model.global*, (titlePart, model.global*)+),
    att.global.attributes,
    att.canonical.attributes,
    empty
  }
titlePart =
  
  ## contains a subsection or division of the title of a work, as indicated on a title page. [4.6. ]
  element titlePart {
    macro.paraContent,
    att.global.attributes,
    
    ## specifies the role of this subdivision of the title.
    ## Suggested values include: 1] main; 2] sub(subordinate) ; 3] alt(alternate) ; 4] short; 5] desc(descriptive) 
    [ a:defaultValue = "main" ]
    attribute type {
      
      ## main title of the work
      "main"
      | 
        ## (subordinate) subtitle of the work
        "sub"
      | 
        ## (alternate) alternative title of the work
        "alt"
      | 
        ## abbreviated form of title
        "short"
      | 
        ## (descriptive) descriptive paraphrase of the work
        "desc"
      | xsd:Name
    }?,
    empty
  }
docAuthor =
  
  ## (document author) contains the name of the author of the document, as given on the title page (often but not always contained in a byline). [4.6. ]
  element docAuthor {
    macro.phraseSeq,
    att.global.attributes,
    att.canonical.attributes,
    empty
  }
imprimatur =
  
  ## contains a formal statement authorizing the publication of a work, sometimes required to appear on a title page or its verso. [4.6. ]
  element imprimatur { macro.paraContent, att.global.attributes, empty }
docEdition =
  
  ## (document edition) contains an edition statement as presented on a title page of a document. [4.6. ]
  element docEdition { macro.paraContent, att.global.attributes, empty }
docImprint =
  
  ## (document imprint) contains the imprint statement (place and date of publication, publisher name), as given (usually) at the foot of a title page. [4.6. ]
  element docImprint {
    (text
     | model.gLike
     | model.phrase
     | pubPlace
     | docDate
     | publisher
     | model.global)*,
    att.global.attributes,
    empty
  }
docDate =
  
  ## (document date) contains the date of a document, as given on a title page or in a dateline. [4.6. ]
  element docDate {
    macro.phraseSeq,
    att.global.attributes,
    
    ## gives the value of the date in standard form, i.e. YYYY-MM-DD.
    attribute when { data.temporal.w3c }?,
    empty
  }
front =
  
  ## (front matter) contains any prefatory matter (headers, title page, prefaces, dedications, etc.) found at the start of a document, before the main body. [4.6.  4. ]
  element front {
    ((model.frontPart
      | model.pLike
      | model.pLike.front
      | model.global)*,
     (((model.div1Like,
        (model.div1Like | model.frontPart | model.global)*)
       | (model.divLike,
          (model.divLike | model.frontPart | model.global)*)),
      (model.divBottom, (model.divBottom | model.global)*)?)?),
    att.global.attributes,
    att.declaring.attributes,
    empty
  }
back =
  
  ## (back matter) contains any appendixes, etc. following the main part of a text. [4.7.  4. ]
  element back {
    ((model.frontPart
      | model.pLike.front
      | model.pLike
      | model.listLike
      | model.global)*,
     ((model.div1Like,
       (model.frontPart | model.div1Like | model.global)*)
      | (model.divLike,
         (model.frontPart | model.divLike | model.global)*))?,
     (model.divBottomPart, (model.divBottomPart | model.global)*)?),
    att.global.attributes,
    att.declaring.attributes,
    empty
  }
att.repeatable.attributes =
  att.repeatable.attribute.allowText,
  att.repeatable.attribute.context,
  att.repeatable.attribute.minOccurs,
  att.repeatable.attribute.maxOccurs
att.repeatable.attribute.allowText =
  
  ## when true, indicates that the content of this component may include text as well as other elements
  attribute allowText { data.truthValue }?
att.repeatable.attribute.context =
  
  ## supplies an XPath identifying a context within which this component of a content model must be found
  attribute context { text }?
att.repeatable.attribute.minOccurs =
  
  ## (minimum number of occurences) indicates the smallest number of times this component may occur.
  [ a:defaultValue = "1" ] attribute minOccurs { data.count }?
att.repeatable.attribute.maxOccurs =
  
  ## (maximum number of occurences) indicates the largest number of times this component may occur.
  [ a:defaultValue = "1" ]
  attribute maxOccurs { data.count | "unbounded" }?
model.contentPart =
  classRef | elementRef | macroRef | sequence | alternate
att.combinable.attributes =
  att.deprecated.attributes, att.combinable.attribute.mode
att.combinable.attribute.mode =
  
  ## specifies the effect of this declaration on its parent object.
  [ a:defaultValue = "add" ]
  attribute mode {
    
    ## this declaration is added to the current definitions
    "add"
    | 
      ## if present already, the whole of the declaration for this object is removed from the current setup
      "delete"
    | 
      ## this declaration changes the declaration of the same name in the current definition
      "change"
    | 
      ## this declaration replaces the declaration of the same name in the current definition
      "replace"
  }?
att.identified.attributes =
  att.combinable.attributes,
  att.identified.attribute.ident,
  att.identified.attribute.predeclare,
  att.identified.attribute.module,
  att.identified.attribute.status
att.identified.attribute.ident =
  
  ## supplies the identifier by which this element may be referenced.
  attribute ident { data.name }
att.identified.attribute.predeclare =
  
  ## says whether this object should be predeclared in the tei infrastructure module.
  [ a:defaultValue = "false" ] attribute predeclare { data.truthValue }?
att.identified.attribute.module =
  
  ## supplies a name for the module in which this object is to be declared.
  attribute module { data.xmlName }?
att.identified.attribute.status =
  
  ## indicates the current status of the object identified with respect to the current version of the TEI Guidelines.
  [ a:defaultValue = "stable" ]
  attribute status {
    
    ## the item is not recommended for use, and may be withdrawn at a future release.
    "deprecated"
    | 
      ## the item is new and still under review.
      "unstable"
    | 
      ## the item has changed significantly since the preceding version.
      "changed"
    | 
      ## the item has not recently changed and is not expected to do so except for correction of any errors.
      "stable"
  }?
sch:pattern [
  id = "tei_odds-att.identified-spec-in-module-constraint-6"
  "\x{a}" ~
  "      "
  sch:rule [
    context =
      "tei:elementSpec[@module]|tei:classSpec[@module]|tei:macroSpec[@module]"
    "\x{a}" ~
    "        "
    sch:assert [
      test =
        "         (not(ancestor::tei:schemaSpec | ancestor::tei:TEI | ancestor::tei:teiCorpus)) or         (not(@module) or          (not(//tei:moduleSpec) and not(//tei:moduleRef))  or         (//tei:moduleSpec[@ident = current()/@module]) or          (//tei:moduleRef[@key = current()/@module]))         "
      "\x{a}" ~
      "        Specification "
      sch:value-of [ select = "@ident" ]
      ': the value of the module attribute ("'
      sch:value-of [ select = "@module" ]
      '") \x{a}' ~
      "should correspond to an existing module, via a moduleSpec or\x{a}" ~
      "      moduleRef"
    ]
    "\x{a}" ~
    "      "
  ]
  "\x{a}" ~
  "   "
]
att.deprecated.attributes = att.deprecated.attribute.validUntil
att.deprecated.attribute.validUntil =
  
  ## provides a date before which the construct being defined will not be removed.
  attribute validUntil { xsd:date }?
sch:pattern [
  id = "tei_odds-att.deprecated-validUntil-deprecated-constraint-7"
  "\x{a}" ~
  "      "
  sch:rule [
    context = "tei:*[@validUntil]"
    "\x{a}" ~
    "            "
    sch:assert [
      test = "@validUntil cast as xs:date ge          current-date()"
      "\x{a}" ~
      "            "
      sch:value-of [
        select =
          "if          (@ident) then concat('The ',@ident) else          concat('This ',local-name(.),' of          ',ancestor::tei:*[@ident][1]/@ident)"
      ]
      "\x{a}" ~
      "	    construct is outdated (as of "
      sch:value-of [ select = "@validUntil" ]
      "); ODD processors may ignore it, and its use is no longer supported"
    ]
    "\x{a}" ~
    "            "
    sch:assert [
      role = "nonfatal"
      test =
        "@validUntil cast as xs:date ge          (current-date() + (60*xs:dayTimeDuration('P1D')))"
      "\x{a}" ~
      "            "
      sch:value-of [
        select =
          "if (@ident) then concat('The ',@ident) else concat('This ',local-name(.),' of ',ancestor::tei:*[@ident][1]/@ident)"
      ]
      "  construct becomes outdated on "
      sch:value-of [ select = "@validUntil" ]
      "\x{a}" ~
      "         "
    ]
    "\x{a}" ~
    "          "
  ]
  "\x{a}" ~
  "   "
]
att.namespaceable.attributes = att.namespaceable.attribute.ns
att.namespaceable.attribute.ns =
  
  ## (namespace) specifies the namespace to which this element belongs
  [ a:defaultValue = "http://www.tei-c.org/ns/1.0" ]
  attribute ns { data.namespace }?
att =
  
  ## (attribute) contains the name of an attribute appearing within running text. [22. ]
  element att {
    data.name,
    att.global.attributes,
    
    ## supplies an identifier for the scheme in which this name is defined.
    ## Sample values include: 1] TEI(text encoding initiative) ; 2] DBK(docbook) ; 3] XX(unknown) ; 4] imaginary; 5] XHTML; 6] XML; 7] XI
    [ a:defaultValue = "TEI" ] attribute scheme { data.enumerated }?,
    empty
  }
code =
  
  ## contains literal code from some formal language such as a programming language. [22.1.1. ]
  element code {
    text,
    att.global.attributes,
    
    ## (formal language) a name identifying the formal language in which the code is expressed
    attribute lang { data.word }?,
    empty
  }
eg =
  
  ## (example) contains any kind of illustrative example. [22.4.4.  22.4.5. ]
  element eg { macro.phraseSeq, att.global.attributes, empty }
egXML =
  
  ## (example of XML) contains a single well-formed XML fragment demonstrating the use of some XML element or attribute, in which the egXML element itself functions as the root element. [22.1.1. ]
  element teix:egXML {
    (text | macro.anyXML)*,
    att.global.attributes,
    att.source.attributes,
    
    ## indicates the intended validity of the example with respect to a schema.
    [ a:defaultValue = "true" ]
    attribute valid {
      
      ## the example is intended to be fully valid, assuming that its root element, or a provided root element, could have been used as a possible root element in the schema concerned.
      "true"
      | 
        ## the example could be transformed into a valid document by inserting any number of valid attributes and child elements anywhere within it; or it is valid against a version of the schema concerned in which the provision of character data, list, element, or attribute values has been made optional.
        "feasible"
      | 
        ## the example is not intended to be valid, and contains deliberate errors.
        "false"
    }?,
    empty
  }
gi =
  
  ## (element name) contains the name (generic identifier) of an element. [22.  22.4.4. ]
  element gi {
    data.name,
    att.global.attributes,
    
    ## supplies the name of the scheme in which this name is defined.
    ## Sample values include: 1] TEI; 2] DBK(docbook) ; 3] XX(unknown) ; 4] Schematron; 5] HTML
    [ a:defaultValue = "TEI" ] attribute scheme { data.enumerated }?,
    empty
  }
ident =
  
  ## (identifier) contains an identifier or name for an object of some kind in a formal language. ident is used for tokens such as variable names, class names, type names, function names etc. in formal programming languages. [22.1.1. ]
  element ident {
    text, att.global.attributes, att.typed.attributes, empty
  }
tag =
  
  ## contains text of a complete start- or end-tag, possibly including attribute specifications, but excluding the opening and closing markup delimiter characters. [22. ]
  element tag {
    text,
    att.global.attributes,
    
    ## indicates the type of XML tag intended
    attribute type {
      
      ## a start-tag, with delimiters < and > is intended
      "start"
      | 
        ## an end-tag, with delimiters </ and > is intended
        "end"
      | 
        ## a empty tag, with delimiters < and /> is intended
        "empty"
      | 
        ## a pi (processing instruction), with delimiters <? and ?> is intended
        "pi"
      | 
        ## a comment, with delimiters <!-- and --> is intended
        "comment"
      | 
        ## a marked-section, with delimiters <[CDATA[ and ]]> is intended
        "ms"
    }?,
    
    ## supplies the name of the schema in which this tag is defined.
    ## Sample values include: 1] TEI(text encoding initiative) ; 2] DBK(docbook) ; 3] XX(unknown) ; 4] Schematron; 5] HTML
    [ a:defaultValue = "TEI" ] attribute scheme { data.enumerated }?,
    empty
  }
val =
  
  ## (value) contains a single attribute value. [22.  22.4.5. ]
  element val { text, att.global.attributes, empty }
specList =
  
  ## (specification list) marks where a list of descriptions is to be inserted into the prose documentation. [22.1.2. ]
  element specList { specDesc+, att.global.attributes, empty }
specDesc =
  
  ## (specification description) indicates that a description of the specified element or class should be included at this point within a document. [22.1.2. ]
  element specDesc {
    empty,
    att.global.attributes,
    
    ## (identifier) supplies the identifier of the documentary element or class for which a description is to be obtained.
    attribute key { data.name }?,
    
    ## (attributes) supplies attribute names for which descriptions should additionally be obtained.
    attribute atts {
      list { data.name* }
    }?,
    empty
  }
classRef =
  
  ## points to the specification for an attribute or model class which is to be included in a schema [22.4.6. ]
  element classRef {
    empty,
    att.global.attributes,
    att.repeatable.attributes,
    att.readFrom.attributes,
    
    ## the identifier used for the required class within the source indicated.
    attribute key { data.xmlName },
    
    ## indicates how references to this class within a content model should be interpreted.
    attribute expand {
      
      ## any one member of the class may appear
      "alternate"
      | 
        ## a single occurrence of all members of the class may appear in sequence
        "sequence"
      | 
        ## a single occurrence of one or more members of the class may appear in sequence 
        "sequenceOptional"
      | 
        ## one or more occurrences of one or more members of the class may appear in sequence. 
        "sequenceOptionalRepeatable"
      | 
        ## one or more occurrences of all members of the class may appear in sequence
        "sequenceRepeatable"
    }?,
    (
     ## supplies a list of class members which are to be included in the schema being defined.
     attribute include {
       list { data.xmlName* }
     }?
     | 
       ## supplies a list of class members which are to be excluded from the schema being defined.
       attribute except {
         list { data.xmlName* }
       }?),
    empty
  }
elementRef =
  
  ## points to the specification for some element which is to be included in a schema [22.2. ]
  element elementRef {
    empty,
    att.global.attributes,
    att.repeatable.attributes,
    att.readFrom.attributes,
    
    ## the identifier used for the required element within the source indicated.
    attribute key { data.xmlName },
    empty
  }
macroRef =
  
  ## points to the specification for some pattern which is to be included in a schema [22.4.7. ]
  element macroRef {
    empty,
    att.global.attributes,
    att.readFrom.attributes,
    
    ## the identifier used for the required pattern within the source indicated.
    attribute key { data.xmlName },
    empty
  }
moduleRef =
  
  ## (module reference) references a module which is to be incorporated into a schema. [22.2. ]
  element moduleRef {
    (content?)
    >> sch:pattern [
         id = "tei_odds-moduleRef-modref-constraint-8"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:moduleRef"
           "\x{a}" ~
           "               "
           sch:report [
             test = "* and @key"
             "\x{a}" ~
             "Child elements of "
             sch:name [ ]
             " are only allowed when an external module is being loaded\x{a}" ~
             "        "
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ],
    att.global.attributes,
    att.readFrom.attributes,
    (
     ## specifies a default prefix which will be prepended to all patterns from the imported module
     attribute prefix { data.xmlName }?)
    >> sch:pattern [
         id = "tei_odds-moduleRef-prefix-not-same-prefix-constraint-9"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:moduleRef"
           "\x{a}" ~
           "               "
           sch:report [
             test =
               "//*[ not( generate-id(.) eq generate-id(      current() ) ) ]/@prefix = @prefix"
             "The prefix attribute\x{a}" ~
             "	    of "
             sch:name [ ]
             " should not match that of any other\x{a}" ~
             "	    element (it would defeat the purpose)"
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ],
    (
     ## supplies a list of the elements which are to be copied from the specified module into the schema being defined.
     attribute include {
       list { data.xmlName* }
     }?
     | 
       ## supplies a list of the elements which are not to be copied from the specified module into the schema being defined.
       attribute except {
         list { data.xmlName* }
       }?),
    (
     ## the name of a TEI module
     attribute key { data.xmlName }?
     | 
       ## (uniform resource locator) refers to a non-TEI module of RELAX NG code by external location
       attribute url { data.pointer }?),
    empty
  }
moduleSpec =
  
  ## (module specification) documents the structure, content, and purpose of a single module, i.e. a named and externally visible group of declarations. [22.2. ]
  element moduleSpec {
    ((model.glossLike | model.descLike)*,
     exemplum*,
     remarks?,
     listRef*),
    att.global.attributes,
    att.identified.attributes,
    att.typed.attributes,
    empty
  }
schemaSpec =
  
  ## (schema specification) generates a TEI-conformant schema and documentation for it. [2.3.  22.2.  23.5.1. ]
  element schemaSpec {
    ((model.glossLike | model.descLike)*,
     (model.oddRef | model.oddDecl)*),
    att.global.attributes,
    att.identified.attributes,
    att.namespaceable.attributes,
    att.readFrom.attributes,
    
    ## specifies entry points to the schema, i.e. which patterns may be used as the root of documents conforming to it.
    [ a:defaultValue = "TEI" ]
    attribute start {
      list { data.name+ }
    }?,
    
    ## specifies a default prefix which will be prepended to all patterns relating to TEI elements, unless otherwise stated.
    attribute prefix { "" | data.xmlName }?,
    
    ## (target language) specifies which language to use when creating the objects in a schema if names for elements or attributes are available in more than one language
    attribute targetLang { data.language }?,
    
    ## (documentation language) specifies which languages to use when creating documentation if the description for an element, attribute, class or macro is available in more than one language
    attribute docLang {
      list { data.language+ }
    }?,
    empty
  }
specGrp =
  
  ## (specification group) contains any convenient grouping of specifications for use within the current module. [22.2. ]
  element specGrp {
    (model.oddDecl | model.oddRef | model.divPart)*,
    att.global.attributes,
    empty
  }
specGrpRef =
  
  ## (reference to a specification group) indicates that the declarations contained by the specGrp referenced should be inserted at this point. [22.2. ]
  element specGrpRef {
    empty,
    att.global.attributes,
    
    ## points at the specification group which logically belongs here.
    attribute target { data.pointer },
    empty
  }
elementSpec =
  
  ## (element specification) documents the structure, content, and purpose of a single element type. [22.4.4.  22. ]
  element elementSpec {
    ((model.glossLike | model.descLike)*,
     classes?,
     content?,
     valList?,
     constraintSpec*,
     attList?,
     exemplum*,
     remarks*,
     listRef*),
    att.global.attributes,
    att.identified.attributes,
    att.namespaceable.attributes,
    
    ## specifies a default prefix which will be prepended to all patterns relating to the element, unless otherwise stated.
    attribute prefix { "" | data.xmlName }?,
    empty
  }
classSpec =
  
  ## (class specification) contains reference information for a TEI element class; that is a group of elements which appear together in content models, or which share some common attribute, or both. [22.3.  22.4.6. ]
  element classSpec {
    ((model.glossLike | model.descLike)*,
     classes?,
     constraintSpec*,
     attList?,
     exemplum*,
     remarks*,
     listRef*),
    att.global.attributes,
    att.identified.attributes,
    
    ## indicates whether this is a model class or an attribute class
    attribute type {
      
      ## (content model) members of this class appear in the same content models
      "model"
      | 
        ## (attributes) members of this class share common attributes
        "atts"
    },
    
    ## indicates which alternation and sequence instantiations of a model class may be referenced. By default, all variations are permitted.
    attribute generate {
      list {
        (
         ## members of the class are alternatives
         "alternation"
         | 
           ## members of the class are to be provided in sequence
           "sequence"
         | 
           ## members of the class may be provided, in sequence, but are optional
           "sequenceOptional"
         | 
           ## members of the class may be provided one or more times, in sequence, but are optional.
           "sequenceOptionalRepeatable"
         | 
           ## members of the class may be provided one or more times, in sequence
           "sequenceRepeatable"),
        (
         ## members of the class are alternatives
         "alternation"
         | 
           ## members of the class are to be provided in sequence
           "sequence"
         | 
           ## members of the class may be provided, in sequence, but are optional
           "sequenceOptional"
         | 
           ## members of the class may be provided one or more times, in sequence, but are optional.
           "sequenceOptionalRepeatable"
         | 
           ## members of the class may be provided one or more times, in sequence
           "sequenceRepeatable")?,
        (
         ## members of the class are alternatives
         "alternation"
         | 
           ## members of the class are to be provided in sequence
           "sequence"
         | 
           ## members of the class may be provided, in sequence, but are optional
           "sequenceOptional"
         | 
           ## members of the class may be provided one or more times, in sequence, but are optional.
           "sequenceOptionalRepeatable"
         | 
           ## members of the class may be provided one or more times, in sequence
           "sequenceRepeatable")?,
        (
         ## members of the class are alternatives
         "alternation"
         | 
           ## members of the class are to be provided in sequence
           "sequence"
         | 
           ## members of the class may be provided, in sequence, but are optional
           "sequenceOptional"
         | 
           ## members of the class may be provided one or more times, in sequence, but are optional.
           "sequenceOptionalRepeatable"
         | 
           ## members of the class may be provided one or more times, in sequence
           "sequenceRepeatable")?,
        (
         ## members of the class are alternatives
         "alternation"
         | 
           ## members of the class are to be provided in sequence
           "sequence"
         | 
           ## members of the class may be provided, in sequence, but are optional
           "sequenceOptional"
         | 
           ## members of the class may be provided one or more times, in sequence, but are optional.
           "sequenceOptionalRepeatable"
         | 
           ## members of the class may be provided one or more times, in sequence
           "sequenceRepeatable")?
      }
    }?,
    empty
  }
macroSpec =
  
  ## (macro specification) documents the function and implementation of a pattern. [22.3.  22.4.7. ]
  element macroSpec {
    ((model.glossLike | model.descLike)*,
     (content | valList)*,
     constraintSpec*,
     exemplum*,
     remarks*,
     listRef*),
    att.global.attributes,
    att.identified.attributes,
    
    ## indicates which type of entity should be generated, when an ODD processor is generating a module using XML DTD syntax.
    attribute type {
      
      ## (parameter entity) 
      "pe"
      | 
        ## (datatype entity) 
        "dt"
    }?,
    empty
  }
remarks =
  
  ## contains any commentary or discussion about the usage of an element, attribute, class, or entity not otherwise documented within the containing element. [22.4.4.  22.4.5.  22.4.6.  22.4.7. ]
  element remarks {
    model.pLike+,
    att.global.attributes,
    att.translatable.attributes,
    empty
  }
listRef =
  
  ## (list of references) supplies a list of significant references to places where this element is discussed, in the current document or elsewhere.
  element listRef { ptr+, att.global.attributes, empty }
exemplum =
  
  ## groups an example demonstrating the use of an element along with optional paragraphs of commentary. [22.4.4. ]
  element exemplum {
    (model.pLike*, (egXML | eg), model.pLike*),
    att.global.attributes,
    att.typed.attributes,
    att.translatable.attributes,
    empty
  }
classes =
  
  ## specifies all the classes of which the documented element or class is a member or subclass. [22.4.4.  22.4.6. ]
  element classes {
    memberOf*,
    att.global.attributes,
    
    ## specifies the effect of this declaration on its parent module.
    [ a:defaultValue = "replace" ]
    attribute mode {
      
      ## this declaration changes the declaration of the same name in the current definition
      "change"
      | 
        ## this declaration replaces the declaration of the same name in the current definition
        "replace"
    }?,
    empty
  }
memberOf =
  
  ## specifies class membership of the documented element or class. [22.4.3. ]
  element memberOf {
    macro.xtext,
    att.global.attributes,
    
    ## specifies the identifier for a class of which the documented element or class is a member or subclass
    attribute key { data.name }?,
    
    ## specifies the effect of this declaration on its parent module.
    [ a:defaultValue = "add" ]
    attribute mode {
      
      ## this declaration is added to the current definitions
      "add"
      | 
        ## this declaration and all of its children are removed from the current setup
        "delete"
    }?,
    
    ## supplies the maximum number of times the element can occur in elements which use this model class in their content model
    attribute max { data.numeric }?,
    
    ## supplies the minumum number of times the element must occur in elements which use this model class in their content model
    attribute min { data.numeric }?,
    empty
  }
equiv =
  
  ## (equivalent) specifies a component which is considered equivalent to the parent element, either by co-reference, or by external link. [3.3.4.  22.4.1. ]
  element equiv {
    empty,
    att.global.attributes,
    att.internetMedia.attributes,
    
    ## a single word which follows the rules defining a legal XML name (see ), naming the underlying concept of which the parent is a representation.
    attribute name { data.name }?,
    
    ## (uniform resource identifier) references the underlying concept of which the parent is a representation by means of some external identifier
    attribute uri { data.pointer }?,
    
    ## references an external script which contains a method to transform instances of this element to canonical TEI
    attribute filter { data.pointer }?,
    empty
  }
altIdent =
  
  ## (alternate identifier) supplies the recommended XML name for an element, class, attribute, etc. in some language. [3.3.4.  22.4.1. ]
  element altIdent {
    text, att.global.attributes, att.typed.attributes, empty
  }
content =
  
  ## (content model) contains the text of a declaration for the schema documented. [22.4.4. ]
  element content {
    (valList | macro.anyXML+ | model.contentPart*),
    att.global.attributes,
    
    ## when true, indicates that textual content is permitted.
    attribute allowText { data.truthValue }?,
    
    ## controls whether or not pattern names generated in the corresponding Relax NG schema source are automatically prefixed to avoid potential nameclashes.
    [ a:defaultValue = "true" ]
    attribute autoPrefix {
      
      ## Each name referenced in e.g. a rng:ref element within a content model is automatically prefixed by the value of the prefix attribute on the current schemaSpec
      "true"
      | 
        ## No prefixes are added: any prefix required by the value of the prefix attribute on the current schemaSpec must therefore be supplied explicitly, as appropriate.
        "false"
    }?,
    empty
  }
sequence =
  
  ## sequence of references
  element sequence {
    model.contentPart+,
    att.global.attributes,
    att.repeatable.attributes,
    
    ## if true, indicates that the order in which component elements of a sequence appear in a document must correspond to the order in which they are given in the content model.
    attribute preserveOrder { data.truthValue }?,
    empty
  }
alternate =
  
  ## an alternation of references
  element alternate {
    model.contentPart+,
    att.global.attributes,
    att.repeatable.attributes,
    empty
  }
constraint =
  
  ## (constraint rules) the formal rules of a constraint [22.4.4. ]
  element constraint {
    (text | macro.anyXML), att.global.attributes, empty
  }
constraintSpec =
  
  ## (constraint on schema) contains a constraint, expressed in some formal syntax, which cannot be expressed in the structural content model [22.4.4. ]
  element constraintSpec {
    (model.glossLike | model.descLike)*,
    (constraint?)
    >> sch:ns [
         prefix = "s"
         uri = "http://www.ascc.net/xml/schematron"
       ]
    >> sch:pattern [
         id = "tei_odds-constraintSpec-sch-constraint-7"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:constraintSpec"
           "\x{a}" ~
           "               "
           sch:report [
             test =
               "tei:constraint/s:* and    not(@scheme='schematron')"
             "\x{a}" ~
             "	Rules in the Schematron 1.* language must be inside\x{a}" ~
             "	a constraintSpec with a value of 'schematron' on the scheme attribute\x{a}" ~
             "      "
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ]
    >> sch:ns [
         prefix = "sch"
         uri = "http://purl.oclc.org/dsdl/schematron"
       ]
    >> sch:pattern [
         id = "tei_odds-constraintSpec-isosch-constraint-8"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:constraintSpec"
           "\x{a}" ~
           "               "
           sch:report [
             test =
               "tei:constraint/sch:* and    not(@scheme='isoschematron')"
             "\x{a}" ~
             "	Rules in the ISO Schematron language must be inside\x{a}" ~
             "	a constraintSpec with a value of 'isoschematron' on the scheme attribute\x{a}" ~
             "      "
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ]
    >> sch:ns [
         prefix = "sch"
         uri = "http://purl.oclc.org/dsdl/schematron"
       ]
    >> sch:pattern [
         id = "tei_odds-constraintSpec-needrules-constraint-10"
         "\x{a}" ~
         "            "
         sch:rule [
           context =
             "tei:macroSpec/tei:constraintSpec[@scheme='isoschematron']/tei:constraint"
           "\x{a}" ~
           "	              "
           sch:report [
             test = "sch:assert|sch:report"
             "An ISO Schematron constraint specification for a macro should not have an 'assert' or 'report' element without a parent 'rule' element"
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ],
    att.global.attributes,
    att.identified.attributes,
    att.typed.attributes,
    
    ## supplies the name of the language in which the constraints are defined
    attribute scheme {
      
      ## (Schematron) 
      "schematron"
      | 
        ## (ISO Schematron) 
        "isoschematron"
      | 
        ## (XSLT) 
        "xsl"
      | 
        ## (private constraint language) 
        "private"
    },
    empty
  }
attList =
  
  ## contains documentation for all the attributes associated with this element, as a series of attDef elements. [22.4.4.  22.4.6. ]
  element attList {
    (attRef | attDef | attList)+,
    att.global.attributes,
    
    ## (organization) specifies whether all the attributes in the list are available (org="group") or only one of them (org="choice")
    [ a:defaultValue = "group" ]
    attribute org {
      
      ## grouped
      "group"
      | 
        ## alternated
        "choice"
    }?,
    empty
  }
attDef =
  
  ## (attribute definition) contains the definition of a single attribute. [22.4.5. ]
  element attDef {
    ((model.glossLike | model.descLike)*,
     datatype?,
     constraintSpec*,
     defaultVal?,
     (valList | valDesc+)?,
     exemplum*,
     remarks*)
    >> sch:ns [
         prefix = "teix"
         uri = "http://www.tei-c.org/ns/Examples"
       ]
    >> sch:pattern [
         id = "tei_odds-attDef-attDefContents-constraint-13"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:attDef"
           "\x{a}" ~
           "               "
           sch:assert [
             test =
               "ancestor::teix:egXML[@valid='feasible'] or @mode eq 'change' or @mode eq 'delete' or tei:datatype or tei:valList[@type='closed']"
             "Attribute: the definition of the @"
             sch:value-of [ select = "@ident" ]
             " attribute in the "
             sch:value-of [ select = "ancestor::*[@ident][1]/@ident" ]
             "\x{a}" ~
             "                  "
             sch:value-of [ select = "' '" ]
             "\x{a}" ~
             "                  "
             sch:value-of [
               select = "local-name(ancestor::*[@ident][1])"
             ]
             " should have a closed valList or a datatype"
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ],
    att.global.attributes,
    att.identified.attributes,
    
    ## specifies the optionality of the attribute.
    [ a:defaultValue = "opt" ]
    attribute usage {
      
      ## (required) 
      "req"
      | 
        ## (recommended ) 
        "rec"
      | 
        ## (optional ) 
        "opt"
    }?,
    
    ## (namespace) specifies the namespace to which this attribute belongs
    [ a:defaultValue = "http://www.tei-c.org/ns/1.0" ]
    attribute ns { data.namespace }?,
    empty
  }
attRef =
  
  ## (attribute pointer) points to the definition of an attribute or group of attributes. [22.2. ]
  element attRef {
    empty,
    att.global.attributes,
    
    ## the name of the attribute class
    attribute class { data.word }?,
    
    ## the name of the attribute
    attribute name { data.text }?,
    empty
  }
datatype =
  
  ## specifies the declared value for an attribute, by referring to any datatype defined by the chosen schema language. [1.4.2.  22.4.5. ]
  element datatype {
    (macroRef | macro.schemaPattern+),
    att.global.attributes,
    
    ## (minimum number of occurences) indicates the minimum number of times this datatype may occur in the specification of the attribute being defined
    [ a:defaultValue = "1" ] attribute minOccurs { data.count }?,
    
    ## (maximum number of occurences) indicates the maximum number of times this datatype may occur in the specification of the attribute being defined
    [ a:defaultValue = "1" ]
    attribute maxOccurs { data.count | "unbounded" }?,
    empty
  }
defaultVal =
  
  ## (default value) specifies the default declared value for an attribute. [22.4.5. ]
  element defaultVal { text, att.global.attributes, empty }
valDesc =
  
  ## (value description) specifies any semantic or syntactic constraint on the value that an attribute may take, additional to the information carried by the datatype element. [22.4.5. ]
  element valDesc {
    macro.phraseSeq.limited,
    att.global.attributes,
    att.translatable.attributes,
    att.combinable.attributes,
    empty
  }
valItem =
  
  ## documents a single value in a predefined list of values. [22.4.5. ]
  element valItem {
    (model.descLike | model.glossLike)*,
    att.global.attributes,
    att.combinable.attributes,
    
    ## specifies the value concerned.
    attribute ident { data.text },
    empty
  }
valList =
  
  ## (value list) contains one or more valItem elements defining possible values. [22.4.5. ]
  element valList {
    valItem*,
    att.global.attributes,
    att.combinable.attributes,
    
    ## specifies the extensibility of the list of values specified.
    [ a:defaultValue = "open" ]
    attribute type {
      
      ## only the values specified are permitted.
      "closed"
      | 
        ## (semi-open) all the values specified should be supported, but other values are legal and software should have appropriate fallback processing for them.
        "semi"
      | 
        ## the values specified are sample values only.
        "open"
    }?,
    empty
  }
model.entryLike = superEntry | entry | entryFree
att.entryLike.attributes = att.entryLike.attribute.type
att.entryLike.attribute.type =
  
  ## indicates type of entry, in dictionaries with multiple types.
  ## Suggested values include: 1] main; 2] hom(homograph) ; 3] xref(cross reference) ; 4] affix; 5] abbr(abbreviation) ; 6] supplemental; 7] foreign
  [ a:defaultValue = "main" ]
  attribute type {
    
    ## a main entry (default).
    "main"
    | 
      ## (homograph) groups information relating to one homograph within an entry.
      "hom"
    | 
      ## (cross reference) a reduced entry whose only function is to point to another main entry (e.g. for forms of an irregular verb or for variant spellings: was pointing to be, or esthete to aesthete).
      "xref"
    | 
      ## an entry for a prefix, infix, or suffix.
      "affix"
    | 
      ## (abbreviation) an entry for an abbreviation.
      "abbr"
    | 
      ## a supplemental entry (for use in dictionaries which issue supplements to their main work in which they include updated information about entries).
      "supplemental"
    | 
      ## an entry for a foreign word in a monolingual dictionary.
      "foreign"
    | xsd:Name
  }?
att.lexicographic.attributes =
  att.datcat.attributes,
  att.lexicographic.attribute.expand,
  att.lexicographic.attribute.norm,
  att.lexicographic.attribute.split,
  att.lexicographic.attribute.value,
  att.lexicographic.attribute.orig,
  att.lexicographic.attribute.location,
  att.lexicographic.attribute.mergedIn,
  att.lexicographic.attribute.opt
att.lexicographic.attribute.expand =
  
  ## gives an expanded form of information presented more concisely in the dictionary
  attribute expand { text }?
att.lexicographic.attribute.norm =
  
  ## (normalized) gives a normalized form of information given by the source text in a non-normalized form
  attribute norm { data.text }?
att.lexicographic.attribute.split =
  
  ## gives the list of split values for a merged form
  attribute split { data.text }?
att.lexicographic.attribute.value =
  
  ## gives a value which lacks any realization in the printed source text.
  attribute value { data.text }?
att.lexicographic.attribute.orig =
  
  ## (original) gives the original string or is the empty string when the element does not appear in the source text.
  attribute orig { data.text }?
att.lexicographic.attribute.location =
  
  ## indicates an anchor element typically elsewhere in the document, but possibly in another document, which is the original location of this component.
  attribute location { data.pointer }?
att.lexicographic.attribute.mergedIn =
  
  ## gives a reference to another element, where the original appears as a merged form.
  attribute mergedIn { data.pointer }?
att.lexicographic.attribute.opt =
  
  ## (optional) indicates whether the element is optional or not
  [ a:defaultValue = "false" ] attribute opt { data.truthValue }?
model.morphLike = gram | gen | number | case | per | tns | mood | iType
model.morphLike_alternation =
  gram | gen | number | case | per | tns | mood | iType
model.morphLike_sequence =
  gram, gen, number, case, per, tns, mood, iType
model.morphLike_sequenceOptional =
  gram?, gen?, number?, case?, per?, tns?, mood?, iType?
model.morphLike_sequenceOptionalRepeatable =
  gram*, gen*, number*, case*, per*, tns*, mood*, iType*
model.morphLike_sequenceRepeatable =
  gram+, gen+, number+, case+, per+, tns+, mood+, iType+
model.gramPart =
  model.morphLike | gramGrp | pos | subc | colloc | usg | lbl
model.formPart =
  model.gramPart | form | orth | pron | hyph | syll | stress
model.ptrLike.form = oRef | oVar | pRef | pVar
superEntry =
  
  ## groups a sequence of entries within any kind of lexical resource, such as a dictionary or lexicon which function as a single unit, for example a set of homographs. [9.1. ]
  element superEntry {
    ((form?, entry+) | dictScrap),
    att.global.attributes,
    att.entryLike.attributes,
    att.sortable.attributes,
    empty
  }
entry =
  
  ## contains a single structured entry in any kind of lexical resource, such as a dictionary or lexicon. [9.1.  9.2. ]
  element entry {
    (hom | sense | model.entryPart.top | model.global | model.ptrLike)+,
    att.global.attributes,
    att.entryLike.attributes,
    att.sortable.attributes,
    empty
  }
entryFree =
  
  ## (unstructured entry) contains a single unstructured entry in any kind of lexical resource, such as a dictionary or lexicon. [9.1.  9.2. ]
  element entryFree {
    (text
     | model.gLike
     | model.entryPart
     | model.morphLike
     | model.phrase
     | model.inter
     | model.global)*,
    att.global.attributes,
    att.entryLike.attributes,
    att.lexicographic.attributes,
    att.sortable.attributes,
    empty
  }
hom =
  
  ## (homograph) groups information relating to one homograph within an entry. [9.2. ]
  element hom {
    (sense | model.entryPart.top | model.global)*,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
sense =
  
  ## groups together all information relating to one word sense in a dictionary entry, for example definitions, examples, and translation equivalents. [9.2. ]
  element sense {
    (text
     | model.gLike
     | sense
     | model.entryPart.top
     | model.phrase
     | model.global)*,
    att.global.attributes,
    att.lexicographic.attributes,
    
    ## gives the nesting depth of this sense.
    attribute level { data.count }?,
    empty
  }
dictScrap =
  
  ## (dictionary scrap) encloses a part of a dictionary entry in which other phrase-level dictionary elements are freely combined. [9.1.  9.2. ]
  element dictScrap {
    (text
     | model.gLike
     | model.entryPart
     | model.morphLike
     | model.phrase
     | model.inter
     | model.global)*,
    att.global.attributes,
    empty
  }
form =
  
  ## (form information group) groups all the information on the written and spoken forms of one headword. [9.3.1. ]
  element form {
    (text
     | model.gLike
     | model.phrase
     | model.inter
     | model.formPart
     | model.global)*,
    att.global.attributes,
    att.lexicographic.attributes,
    
    ## classifies form as simple, compound, etc.
    ## Suggested values include: 1] simple; 2] lemma; 3] variant; 4] compound; 5] derivative; 6] inflected; 7] phrase
    attribute type {
      
      ## single free lexical item
      "simple"
      | 
        ## the headword itself
        "lemma"
      | 
        ## a variant form
        "variant"
      | 
        ## word formed from simple lexical items
        "compound"
      | 
        ## word derived from headword
        "derivative"
      | 
        ## word in other than usual dictionary form
        "inflected"
      | 
        ## multiple-word lexical item
        "phrase"
      | xsd:Name
    }?,
    empty
  }
orth =
  
  ## (orthographic form) gives the orthographic form of a dictionary headword. [9.3.1. ]
  element orth {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    
    ## gives the type of spelling.
    attribute type { data.enumerated }?,
    
    ## gives the extent of the orthographic information provided.
    ## Sample values include: 1] full(full form) ; 2] pref(prefix) ; 3] suff(suffix) ; 4] part(partial) 
    [ a:defaultValue = "full" ] attribute extent { data.enumerated }?,
    empty
  }
pron =
  
  ## (pronunciation) contains the pronunciation(s) of the word. [9.3.1. ]
  element pron {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    
    ## indicates whether the pronunciation is for whole word or part.
    ## Sample values include: 1] full(full form) ; 2] pref(prefix) ; 3] suff(suffix) ; 4] part(partial) 
    [ a:defaultValue = "full" ] attribute extent { data.enumerated }?,
    
    ## indicates what notation is used for the pronunciation, if more than one occurs in the machine-readable dictionary.
    attribute notation { data.enumerated }?,
    empty
  }
hyph =
  
  ## (hyphenation) contains a hyphenated form of a dictionary headword, or hyphenation information in some other form. [9.3.1. ]
  element hyph {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
syll =
  
  ## (syllabification) contains the syllabification of the headword. [9.3.1. ]
  element syll {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
stress =
  
  ## contains the stress pattern for a dictionary headword, if given separately. [9.3.1. ]
  element stress { macro.paraContent, att.global.attributes, empty }
gram =
  
  ## (grammatical information) within an entry in a dictionary or a terminological data file, contains grammatical information relating to a term, word, or form. [9.3.2. ]
  element gram {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    
    ## classifies the grammatical information given according to some convenient typology—in the case of terminological information, preferably the dictionary of data element types specified in ISO 12620.
    ## Sample values include: 1] pos(part of speech) ; 2] gen(gender) ; 3] num(number) ; 4] animate; 5] proper
    attribute type { data.enumerated }?,
    empty
  }
gen =
  
  ## (gender) identifies the morphological gender of a lexical item, as given in the dictionary. [9.3.1. ]
  element gen {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
number =
  
  ## indicates grammatical number associated with a form, as given in a dictionary. [9.3.1.  9.3.2. ]
  element number {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
case =
  
  ## contains grammatical case information given by a dictionary for a given form. [9.3.1. ]
  element case {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
per =
  
  ## (person) contains an indication of the grammatical person (1st, 2nd, 3rd, etc.) associated with a given inflected form in a dictionary. [9.3.1. ]
  element per {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
tns =
  
  ## (tense) indicates the grammatical tense associated with a given inflected form in a dictionary. [9.3.1. ]
  element tns {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
mood =
  
  ## contains information about the grammatical mood of verbs (e.g. indicative, subjunctive, imperative). [9.3.1. ]
  element mood {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
iType =
  
  ## (inflectional class) indicates the inflectional class associated with a lexical item. [9.3.1. ]
  element iType {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    
    ## indicates the type of indicator used to specify the inflection class, when it is necessary to distinguish between the usual abbreviated indications (e.g. inv) and other kinds of indicators, such as special codes referring to conjugation patterns, etc.
    ## Sample values include: 1] abbrev; 2] verbTable
    attribute type { data.enumerated }?,
    empty
  }
gramGrp =
  
  ## (grammatical information group) groups morpho-syntactic information about a lexical item, e.g. pos, gen, number, case, or iType (inflectional class). [9.3.2. ]
  element gramGrp {
    (text
     | model.gLike
     | model.phrase
     | model.inter
     | model.gramPart
     | model.global)*,
    att.global.attributes,
    att.lexicographic.attributes,
    att.typed.attributes,
    empty
  }
pos =
  
  ## (part of speech) indicates the part of speech assigned to a dictionary headword such as noun, verb, or adjective. [9.3.2. ]
  element pos {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
subc =
  
  ## (subcategorization) contains subcategorization information (transitive/intransitive, countable/non-countable, etc.) [9.3.2. ]
  element subc {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
colloc =
  
  ## (collocate) contains any sequence of words that co-occur with the headword with significant frequency. [9.3.2. ]
  element colloc {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    att.typed.attributes,
    empty
  }
def =
  
  ## (definition) contains definition text in a dictionary entry. [9.3.3.1. ]
  element def {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
etym =
  
  ## (etymology) encloses the etymological information in a dictionary entry. [9.3.4. ]
  element etym {
    (text
     | model.gLike
     | model.phrase
     | model.inter
     | usg
     | lbl
     | def
     | model.morphLike
     | xr
     | model.global)*,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
lang =
  
  ## (language name) contains the name of a language mentioned in etymological or other linguistic discussion. [9.3.4. ]
  element lang {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    empty
  }
usg =
  
  ## (usage) contains usage information in a dictionary entry. [9.3.5.2. ]
  element usg {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    
    ## classifies the usage information using any convenient typology.
    ## Sample values include: 1] geo(geographic) ; 2] time; 3] dom(domain) ; 4] register; 5] style; 6] plev(preference level) ; 7] lang(language) ; 8] gram(grammatical) ; 9] syn(synonym) ; 10] hyper(hypernym) ; 11] colloc(collocation) ; 12] comp(complement) ; 13] obj(object) ; 14] subj(subject) ; 15] verb; 16] hint
    attribute type { data.enumerated }?,
    empty
  }
lbl =
  
  ## (label) contains a label for a form, example, translation, or other piece of information, e.g. abbreviation for, contraction of, literally, approximately, synonyms:, etc. [9.3.1.  9.3.3.2.  9.3.5.3. ]
  element lbl {
    macro.paraContent,
    att.global.attributes,
    att.lexicographic.attributes,
    
    ## classifies the label using any convenient typology.
    attribute type { data.enumerated }?,
    empty
  }
xr =
  
  ## (cross-reference phrase) contains a phrase, sentence, or icon referring the reader to some other location in this or another text. [9.3.5.3. ]
  element xr {
    (text
     | model.gLike
     | model.phrase
     | model.inter
     | usg
     | lbl
     | model.global)*,
    att.global.attributes,
    att.lexicographic.attributes,
    
    ## indicates the type of cross reference, using any convenient typology.
    ## Sample values include: 1] syn(synonym) ; 2] etym(etymological) ; 3] cf(compare or consult) ; 4] illus(illustration) 
    attribute type { data.enumerated }?,
    empty
  }
re =
  
  ## (related entry) contains a dictionary entry for a lexical item related to the headword, such as a compound phrase or derived form, embedded inside a larger entry. [9.3.6. ]
  element re {
    (text
     | model.gLike
     | sense
     | model.entryPart.top
     | model.phrase
     | model.global)*,
    att.global.attributes,
    att.lexicographic.attributes,
    att.typed.attributes,
    empty
  }
oRef =
  
  ## (orthographic-form reference) in a dictionary example, indicates a reference to the orthographic form(s) of the headword. [9.4. ]
  element oRef {
    empty,
    att.global.attributes,
    att.lexicographic.attributes,
    att.pointing.attributes,
    
    ## indicates the kind of typographic modification made to the headword in the reference.
    ## Sample values include: 1] cap(capital) ; 2] noHyph(no hyphen) 
    attribute type { data.enumerated }?,
    empty
  }
oVar =
  
  ## (orthographic-variant reference) in a dictionary example, indicates a reference to variant orthographic form(s) of the headword. [9. ]
  element oVar {
    (text | model.gLike | oRef)*,
    att.global.attributes,
    att.lexicographic.attributes,
    att.pointing.attributes,
    
    ## indicates the kind of variant involved.
    ## Sample values include: 1] pt(past tense) ; 2] pp(past participle) ; 3] prp(present participle) ; 4] f(feminine) ; 5] pl(plural) 
    attribute type { data.enumerated }?,
    empty
  }
pRef =
  
  ## (pronunciation reference) in a dictionary example, indicates a reference to the pronunciation(s) of the headword. [9.4. ]
  element pRef {
    empty,
    att.global.attributes,
    att.pointing.attributes,
    att.lexicographic.attributes,
    empty
  }
pVar =
  
  ## (pronunciation-variant reference) in a dictionary example, indicates a reference to variant pronunciation(s) of the headword. [9. ]
  element pVar {
    (text | model.gLike | pRef)*,
    att.global.attributes,
    att.pointing.attributes,
    att.lexicographic.attributes,
    empty
  }
att.global.linking.attributes =
  att.global.linking.attribute.corresp,
  att.global.linking.attribute.synch,
  att.global.linking.attribute.sameAs,
  att.global.linking.attribute.copyOf,
  att.global.linking.attribute.next,
  att.global.linking.attribute.prev,
  att.global.linking.attribute.exclude,
  att.global.linking.attribute.select
att.global.linking.attribute.corresp =
  
  ## (corresponds) points to elements that correspond to the current element in some way.
  attribute corresp {
    list { data.pointer+ }
  }?
att.global.linking.attribute.synch =
  
  ## (synchronous) points to elements that are synchronous with the current element.
  attribute synch {
    list { data.pointer+ }
  }?
att.global.linking.attribute.sameAs =
  
  ## points to an element that is the same as the current element.
  attribute sameAs { data.pointer }?
att.global.linking.attribute.copyOf =
  
  ## points to an element of which the current element is a copy.
  attribute copyOf { data.pointer }?
att.global.linking.attribute.next =
  
  ## points to the next element of a virtual aggregate of which the current element is part.
  attribute next { data.pointer }?
att.global.linking.attribute.prev =
  
  ## (previous) points to the previous element of a virtual aggregate of which the current element is part.
  attribute prev { data.pointer }?
att.global.linking.attribute.exclude =
  
  ## points to elements that are in exclusive alternation with the current element.
  attribute exclude {
    list { data.pointer+ }
  }?
att.global.linking.attribute.select =
  
  ## selects one or more alternants; if one alternant is selected, the ambiguity or uncertainty is marked as resolved. If more than one alternant is selected, the degree of ambiguity or uncertainty is marked as reduced by the number of alternants not selected.
  attribute select {
    list { data.pointer+ }
  }?
link =
  
  ## defines an association or hypertextual link among elements or passages, of some type not more precisely specifiable by other elements. [16.1. ]
  element link {
    empty
    >> sch:pattern [
         id = "tei_odds-link-linkTargets3-constraint-14"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:link"
           "\x{a}" ~
           "               "
           sch:assert [
             test = "contains(normalize-space(@target),' ')"
             "You must supply at least two values for @target or  on "
             sch:name [ ]
             "\x{a}" ~
             "               "
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ],
    att.global.attributes,
    att.pointing.attributes,
    att.typed.attributes,
    empty
  }
linkGrp =
  
  ## (link group) defines a collection of associations or hypertextual links. [16.1. ]
  element linkGrp {
    (link | ptr)+,
    att.global.attributes,
    att.pointing.group.attributes,
    empty
  }
ab =
  
  ## (anonymous block) contains any arbitrary component-level unit of text, acting as an anonymous container for phrase or inter level elements analogous to, but without the semantic baggage of, a paragraph. [16.3. ]
  element ab {
    macro.paraContent,
    att.global.attributes,
    att.typed.attributes,
    att.declaring.attributes,
    att.fragmentable.attributes,
    empty
  }
anchor =
  
  ## (anchor point) attaches an identifier to a point within a text, whether or not it corresponds with a textual element. [8.4.2.  16.4. ]
  element anchor {
    empty, att.global.attributes, att.typed.attributes, empty
  }
seg =
  
  ## (arbitrary segment) represents any segmentation of text below the chunk level. [16.3.  6.2.  7.2.5. ]
  element seg {
    macro.paraContent,
    att.global.attributes,
    att.segLike.attributes,
    att.typed.attributes,
    att.responsibility.attributes,
    empty
  }
when =
  
  ## indicates a point in time either relative to other elements in the same timeline tag, or absolutely. [16.5.2. ]
  element when {
    empty,
    att.global.attributes,
    
    ## supplies an absolute value for the time.
    attribute absolute { data.temporal.w3c }?,
    
    ## specifies the unit of time in which the interval value is expressed, if this is not inherited from the parent timeline.
    ## Suggested values include: 1] d(days) ; 2] h(hours) ; 3] min(minutes) ; 4] s(seconds) ; 5] ms(milliseconds) 
    attribute unit {
      
      ## (days) 
      "d"
      | 
        ## (hours) 
        "h"
      | 
        ## (minutes) 
        "min"
      | 
        ## (seconds) 
        "s"
      | 
        ## (milliseconds) 
        "ms"
      | xsd:Name
    }?,
    
    ## specifies a time interval either as a number or as one of the keywords defined by the datatype data.interval
    attribute interval { data.interval }?,
    
    ## identifies the reference point for determining the time of the current when element, which is obtained by adding the interval to the time of the reference point.
    attribute since { data.pointer }?,
    empty
  }
timeline =
  
  ## provides a set of ordered points in time which can be linked to elements of a spoken text to create a temporal alignment of that text. [16.5.2. ]
  element timeline {
    when+,
    att.global.attributes,
    
    ## designates the origin of the timeline, i.e. the time at which it begins.
    attribute origin { data.pointer }?,
    
    ## specifies the unit of time corresponding to the interval value of the timeline or of its constituent points in time.
    ## Suggested values include: 1] d(days) ; 2] h(hours) ; 3] min(minutes) ; 4] s(seconds) ; 5] ms(milliseconds) 
    attribute unit {
      
      ## (days) 
      "d"
      | 
        ## (hours) 
        "h"
      | 
        ## (minutes) 
        "min"
      | 
        ## (seconds) 
        "s"
      | 
        ## (milliseconds) 
        "ms"
      | xsd:Name
    }?,
    
    ## specifies a time interval either as a positive integral value or using one of a set of predefined codes.
    attribute interval { data.interval }?,
    empty
  }
join =
  
  ## identifies a possibly fragmented segment of text, by pointing at the possibly discontiguous elements which compose it. [16.7. ]
  element join {
    ((model.descLike | model.certLike)*)
    >> sch:pattern [
         id = "tei_odds-join-joinTargets3-constraint-15"
         "\x{a}" ~
         "            "
         sch:rule [
           context = "tei:join"
           "\x{a}" ~
           "               "
           sch:assert [
             test = "contains(@target,' ')"
             "\x{a}" ~
             "You must supply at least two values for @target on "
             sch:name [ ]
             "\x{a}" ~
             "               "
           ]
           "\x{a}" ~
           "            "
         ]
         "\x{a}" ~
         "         "
       ],
    att.global.attributes,
    att.pointing.attributes,
    att.typed.attributes,
    
    ## specifies the name of an element which this aggregation may be understood to represent.
    attribute result { data.name }?,
    
    ## indicates whether the targets to be joined include the entire element indicated (the entire subtree including its root), or just the children of the target (the branches of the subtree).
    [ a:defaultValue = "root" ]
    attribute scope {
      
      ## the rooted subtrees indicated by the target attribute are joined, each subtree become a child of the virtual element created by the join
      "root"
      | 
        ## the children of the subtrees indicated by the target attribute become the children of the virtual element (i.e. the roots of the subtrees are discarded)
        "branches"
    }?,
    empty
  }
joinGrp =
  
  ## (join group) groups a collection of join elements and possibly pointers. [16.7. ]
  element joinGrp {
    (model.glossLike*, (join | ptr)+),
    att.global.attributes,
    att.pointing.group.attributes,
    
    ## supplies the default value for the result on each join included within the group.
    attribute result { data.name }?,
    empty
  }
alt =
  
  ## (alternation) identifies an alternation or a set of choices among elements or passages. [16.8. ]
  element alt {
    empty,
    att.global.attributes,
    att.pointing.attribute.targetLang,
    att.pointing.attribute.evaluate,
    att.typed.attributes,
    
    ## specifies the destination of the reference by supplying one or more URI References
    attribute target {
      list { data.pointer, data.pointer, data.pointer* }
    }?,
    
    ## states whether the alternations gathered in this collection are exclusive or inclusive.
    attribute mode {
      
      ## (exclusive) indicates that the alternation is exclusive, i.e. that at most one of the alternatives occurs.
      "excl"
      | 
        ## (inclusive) indicates that the alternation is not exclusive, i.e. that one or more of the alternatives occur.
        "incl"
    }?,
    
    ## If mode is , each weight states the probability that the corresponding alternative occurs. If mode is incl each weight states the probability that the corresponding alternative occurs given that at least one of the other alternatives occurs.
    attribute weights {
      list { data.probability, data.probability, data.probability* }
    }?,
    empty
  }
altGrp =
  
  ## (alternation group) groups a collection of alt elements and possibly pointers. [16.8. ]
  element altGrp {
    (alt | ptr)*,
    att.global.attributes,
    att.pointing.group.attributes,
    
    ## states whether the alternations gathered in this collection are exclusive or inclusive.
    [ a:defaultValue = "excl" ]
    attribute mode {
      
      ## (exclusive) indicates that the alternation is exclusive, i.e. that at most one of the alternatives occurs.
      "excl"
      | 
        ## (inclusive) indicates that the alternation is not exclusive, i.e. that one or more of the alternatives occur.
        "incl"
    }?,
    empty
  }
table =
  
  ## contains text displayed in tabular form, in rows and columns. [14.1.1. ]
  element table {
    ((model.headLike | model.global)*,
     ((row, model.global*)+ | (model.graphicLike, model.global*)+),
     (model.divBottom, model.global*)*),
    att.global.attributes,
    
    ## indicates the number of rows in the table.
    attribute rows { data.count }?,
    
    ## (columns) indicates the number of columns in each row of the table.
    attribute cols { data.count }?,
    empty
  }
row =
  
  ## contains one row of a table. [14.1.1. ]
  element row {
    cell+, att.global.attributes, att.tableDecoration.attributes, empty
  }
cell =
  
  ## contains one cell of a table. [14.1.1. ]
  element cell {
    macro.specialPara,
    att.global.attributes,
    att.tableDecoration.attributes,
    empty
  }
formula =
  
  ## contains a mathematical or other formula. [14.2. ]
  element formula {
    (text | model.graphicLike | model.hiLike)*,
    att.global.attributes,
    
    ## names the notation used for the content of the element.
    attribute notation { data.enumerated }?,
    empty
  }
notatedMusic =
  
  ## encodes the presence of music notation in a text [14.3. ]
  element notatedMusic {
    (model.labelLike | model.ptrLike | graphic | binaryObject)*,
    att.global.attributes,
    att.placement.attributes,
    att.typed.attributes,
    empty
  }
figure =
  
  ## groups elements representing or containing graphic information such as an illustration, formula, or figure. [14.4. ]
  element figure {
    (model.headLike
     | model.common
     | figDesc
     | model.graphicLike
     | model.global
     | model.divBottom)*,
    att.global.attributes,
    att.placement.attributes,
    att.typed.attributes,
    empty
  }
figDesc =
  
  ## (description of figure) contains a brief prose description of the appearance or content of a graphic figure, for use when documenting an image without displaying it. [14.4. ]
  element figDesc { macro.limitedContent, att.global.attributes, empty }
start = TEI | schemaSpec | elementSpec | classSpec | macroSpec | \div
