<sch:rule context="@source">
<sch:assert role="warning" test="not(normalize-space(.) eq '')">@source attribute
should have content.</sch:assert>
<sch:assert role="warning" test="every $i in tokenize(., '\s+') satisfies substring($i,2)=//mei:*[local-name() eq
'source' or local-name() eq 'manifestation']/@xml:id">Each value in @source should correspond to the @xml:id attribute of a source or
manifestation element.</sch:assert>
</sch:rule>
<classSpec ident="att.source" module="MEI.shared" type="atts">
<desc>Attributes common to elements that may refer to a source.</desc>
<attList org="group">
<attDef ident="source" usage="opt">
<desc>Contains a list of one or more pointers indicating the sources which attest to a given
reading. Each value should correspond to the ID of a
<gi scheme="MEI">source</gi> or
<gi scheme="MEI">manifestation</gi>element located in the document header.</desc>
<constraintSpec ident="check_sourceTarget" scheme="schematron">
<constraint>
<sch:rule context="@source">
<sch:assert role="warning" test="not(normalize-space(.) eq '')">@source attribute
should have content.</sch:assert>
<sch:assert role="warning" test="every $i in tokenize(., '\s+') satisfies substring($i,2)=//mei:*[local-name() eq
'source' or local-name() eq 'manifestation']/@xml:id">Each value in @source should correspond to the @xml:id attribute of a source or
manifestation element.</sch:assert>
</sch:rule>
</constraint>
</constraintSpec>
</attDef>
</attList>
</classSpec>