<sch:rule context="@join">
<sch:assert role="warning" test="not(normalize-space(.) eq '')">@join attribute should
have content.</sch:assert>
<sch:assert role="warning" test="every $i in tokenize(., '\s+') satisfies substring($i,2)=//mei:*/@xml:id">Each
value in @join should correspond to the @xml:id attribute of an
element.</sch:assert>
</sch:rule>
<classSpec ident="att.joined" module="MEI.shared" type="atts">
<desc>Attributes indicating that elements are semantically linked; that is, while the parts
are
encoded separately, together they may be thought of as a single intellectual object.</desc>
<attList org="group">
<attDef ident="join" usage="opt">
<desc>Used for linking visually separate entities that form a single logical entity, for
example, multiple slurs broken across a system break that form a single musical phrase.
Also used to indicate a measure which metrically completes the current one. Record
the
identifiers of the separately encoded components, excluding the one carrying the
attribute.</desc>
<constraintSpec ident="check_joinTarget" scheme="isoschematron">
<constraint>
<sch:rule context="@join">
<sch:assert role="warning" test="not(normalize-space(.) eq '')">@join attribute should
have content.</sch:assert>
<sch:assert role="warning" test="every $i in tokenize(., '\s+') satisfies substring($i,2)=//mei:*/@xml:id">Each
value in @join should correspond to the @xml:id attribute of an
element.</sch:assert>
</sch:rule>
</constraint>
</constraintSpec>
</attDef>
</attList>
</classSpec>