You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.9 KiB
99 lines
2.9 KiB
<?xml version='1.0' encoding='UTF-8'?>
|
|
|
|
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>
|
|
<xs:element name='projects'>
|
|
<xs:complexType>
|
|
<xs:choice minOccurs='0' maxOccurs='unbounded'>
|
|
<xs:element name='project' type='projectType'>
|
|
<xs:unique name='descUniquityConstraint'>
|
|
<xs:selector xpath='description'/>
|
|
<xs:field xpath='@fake-only-once'/>
|
|
</xs:unique>
|
|
</xs:element>
|
|
</xs:choice>
|
|
</xs:complexType>
|
|
<xs:key name='projectKey'>
|
|
<xs:selector xpath='project'/>
|
|
<xs:field xpath='email'/>
|
|
</xs:key>
|
|
<xs:keyref name='subprojectRef' refer='projectKey'>
|
|
<xs:selector xpath='project/subproject'/>
|
|
<xs:field xpath='@ref'/>
|
|
</xs:keyref>
|
|
<!-- define additional keys to enforce exactly one element
|
|
of each kind -->
|
|
<xs:key name='projectNameKey'>
|
|
<xs:selector xpath='project'/>
|
|
<xs:field xpath='name'/>
|
|
</xs:key>
|
|
<xs:key name='projectURLKey'>
|
|
<xs:selector xpath='project'/>
|
|
<xs:field xpath='url'/>
|
|
</xs:key>
|
|
</xs:element>
|
|
|
|
<xs:complexType name='projectType'>
|
|
<xs:choice minOccurs='0' maxOccurs='unbounded'>
|
|
<xs:element name='email' type='emailType'/>
|
|
<xs:element name='name' type='xs:token'/>
|
|
<xs:element name='url' type='urlType'/>
|
|
<xs:element name='description' type='descriptionType'/>
|
|
<xs:element name='subproject' type='subprojectType'/>
|
|
<xs:element name='member' type='memberType'/>
|
|
</xs:choice>
|
|
</xs:complexType>
|
|
|
|
<xs:complexType name='descriptionType'>
|
|
<xs:simpleContent>
|
|
<xs:extension base='xs:token'>
|
|
<xs:attribute name='fake-only-once'
|
|
fixed='there can be at most one <description/> element'/>
|
|
</xs:extension>
|
|
</xs:simpleContent>
|
|
</xs:complexType>
|
|
|
|
<xs:complexType name='subprojectType'>
|
|
<xs:attribute name='inherit-members' type='numericBoolType'/>
|
|
<xs:attribute name='ref' type='projectRefType'/>
|
|
</xs:complexType>
|
|
|
|
<xs:simpleType name='projectRefType'>
|
|
<xs:restriction base='emailType'>
|
|
</xs:restriction>
|
|
</xs:simpleType>
|
|
|
|
<xs:complexType name='memberType'>
|
|
<xs:all>
|
|
<xs:element name='email' type='emailType'
|
|
minOccurs='1' maxOccurs='1'/>
|
|
<xs:element name='name' type='xs:token'
|
|
minOccurs='0' maxOccurs='1'/>
|
|
<xs:element name='role' type='xs:token'
|
|
minOccurs='0' maxOccurs='1'/>
|
|
</xs:all>
|
|
<xs:attribute name='is-lead' type='numericBoolType'/>
|
|
</xs:complexType>
|
|
|
|
<!-- generic types -->
|
|
<xs:simpleType name='emailType'>
|
|
<xs:restriction base='xs:token'>
|
|
<!-- minimal safe regex -->
|
|
<xs:pattern value="[^@]+@[^.]+\..+"/>
|
|
</xs:restriction>
|
|
</xs:simpleType>
|
|
|
|
<xs:simpleType name='urlType'>
|
|
<xs:restriction base='xs:token'>
|
|
<!-- TODO: something better? -->
|
|
<xs:pattern value="https?://\S+"/>
|
|
</xs:restriction>
|
|
</xs:simpleType>
|
|
|
|
<xs:simpleType name='numericBoolType'>
|
|
<xs:restriction base='xs:integer'>
|
|
<xs:minInclusive value='0'/>
|
|
<xs:maxInclusive value='1'/>
|
|
</xs:restriction>
|
|
</xs:simpleType>
|
|
</xs:schema>
|