<sch:rule context="@part[some $i in tokenize(., '\s+') satisfies (matches($i, '^%all$'))]">
<sch:assert test="count(tokenize(., '\s+')) = 1">'%all' cannot be mixed with other
values.</sch:assert>
</sch:rule>
<sch:rule context="@partstaff[some $i in tokenize(., '\s+') satisfies (matches($i, '^%all$'))]">
<sch:assert test="count(tokenize(., '\s+')) = 1">'%all' cannot be mixed with other
values.</sch:assert>
</sch:rule>
<classSpec ident="att.partIdent" module="MEI.shared" type="atts">
<desc>Attributes for identifying the part in which the current feature appears.</desc>
<attList org="group">
<attDef ident="part" usage="opt">
<desc>Indicates the part in which the current feature should appear. Use '%all' when the
feature should occur in every part.</desc>
<datatype maxOccurs="unbounded" minOccurs="1">
<rng:data type="token">
<rng:param name="pattern">(%all|#[\i][\c]+)</rng:param>
</rng:data>
</datatype>
<constraintSpec ident="check_part_attr_all" scheme="schematron">
<constraint>
<sch:rule context="@part[some $i in tokenize(., '\s+') satisfies (matches($i, '^%all$'))]">
<sch:assert test="count(tokenize(., '\s+')) = 1">'%all' cannot be mixed with other
values.</sch:assert>
</sch:rule>
</constraint>
</constraintSpec>
</attDef>
<attDef ident="partstaff" usage="opt">
<desc>Signifies the part staff on which a notated feature occurs. Use '%all' when the
feature should occur on every staff.</desc>
<datatype maxOccurs="unbounded" minOccurs="1">
<rng:data type="token">
<rng:param name="pattern">(%all|\d+(-\d+)?)</rng:param>
</rng:data>
</datatype>
<constraintSpec ident="check_partstaff_attr_all" scheme="schematron">
<constraint>
<sch:rule context="@partstaff[some $i in tokenize(., '\s+') satisfies (matches($i, '^%all$'))]">
<sch:assert test="count(tokenize(., '\s+')) = 1">'%all' cannot be mixed with other
values.</sch:assert>
</sch:rule>
</constraint>
</constraintSpec>
</attDef>
</attList>
</classSpec>