Type-list.odd
Jump to navigation
Jump to search
This ODD demonstrates how to replace an attribute that a TEI element inherits from a class with a locally defined one, e.g., to add a controlled vocabulary. In this case, the type= attribute of <div> is modified.
<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:lang="en"
xmlns:sch="http://purl.oclc.org/dsdl/schematron"
xmlns:rng="http://relaxng.org/ns/structure/1.0"
xmlns="http://www.tei-c.org/ns/1.0" >
<teiHeader>
<fileDesc>
<titleStmt>
<title>Sample ODD for Constraining <att>type</att> of <gi>div</gi></title>
<author xml:id="SB"><name type="person">Syd Bauman</name></author>
</titleStmt>
<publicationStmt>
<p>Intended for publication as an example TEI P5 customization
on TEI Wiki</p>
<p>© 2010 Syd Bauman and Brown University Women Writer's
Project. Available under the GFDL.</p>
</publicationStmt>
<sourceDesc>
<p>Born digital, based on the WWP EMPB schema.</p>
</sourceDesc>
</fileDesc>
<revisionDesc>
<change when="2011-09-01" who="#SB">
<list>
<item>fix typos in comments</item>
<item>fix typo in <att>start</att>: div1 -> div</item>
<item>improve introductory prose</item>
<item>add <gi>desc</gi></item>
<item>added <gi>revisionDesc</gi></item>
</list>
</change>
</revisionDesc>
</teiHeader>
<text>
<front>
<divGen type="toc"/>
<div type="section">
<head>Introduction</head>
<p>This TEI ODD file (and thus the derived schema or reference
documentation you may be reading) is the technical
specification of a toy schema that exists just to demonstrate
how one constrains the value of an attribute that is normally
inherited from a class. In this case, the <att>type</att>
attribute of <gi>div</gi> will be constrained to a
semi-controlled vocabulary.
<specList>
<specDesc key="div" atts="type"/>
</specList></p>
</div>
</front>
<body>
<p>Modifying the definition of an attribute on a given element
when that element normally inherits that attribute from a class
is a bit tricky. The main <soCalled>gotcha</soCalled> is that we
intuitively expect the <att>mode</att> attribute of
<gi>classes</gi> to be inherited from its parent
<gi>elementSpec</gi>. But <gi>classes</gi> has its own
<att>mode</att> attribute (rather than inheriting it from <name
type="class">att.combinable</name>), for which the default value
is <val>replace</val>. Thus we need to specify <tag>classes
mode="change"</tag>.</p>
<schemaSpec ident="div-type-list"
prefix="dtl_"
start="teiCorpus TEI text body div">
<moduleRef key="tei"/>
<moduleRef key="header"/>
<moduleRef key="core"/>
<moduleRef key="textstructure"/>
<elementSpec ident="div" module="core" mode="change">
<!-- First, remove <div> from att.typed. -->
<classes mode="change">
<!-- Note that omitting the mode=change, above, is a "gotcha" that causes -->
<!-- this <classes> to replace the TEI-defined <classes> (even though you -->
<!-- expect mode= to be inherited from <elementSpec>), and since there is -->
<!-- no <memberOf key=model.divLike> in this <classes>, the resulting -->
<!-- schema would have no where for <div> to go! -->
<memberOf key="att.typed" mode="delete"/> <!-- do the deletion -->
</classes>
<attList>
<!-- add our new type= attribute: -->
<attDef ident="type" mode="replace" usage="req">
<desc>allows user to choose one of three pre-determined
values, or to fill in her own value, which in theory
should express what kind of subdivision of the front,
body, or back of the text this is, but in fact are just
useless demonstrations</desc>
<datatype minOccurs="1" maxOccurs="1">
<rng:ref name="data.enumerated"/>
</datatype>
<valList type="semi">
<valItem ident="tst1">
<gloss>test one</gloss>
<desc>a boring test string</desc>
</valItem>
<valItem ident="tst2">
<gloss>test two</gloss>
<desc>another boring test string</desc>
</valItem>
<valItem ident="tst3">
<gloss>test three</gloss>
<desc>yet another boring test string</desc>
</valItem>
</valList>
</attDef>
</attList>
</elementSpec>
</schemaSpec>
</body>
</text>
</TEI>