diff options
Diffstat (limited to 'metadata/xml-schema/projects.xsd')
-rw-r--r-- | metadata/xml-schema/projects.xsd | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/metadata/xml-schema/projects.xsd b/metadata/xml-schema/projects.xsd new file mode 100644 index 000000000000..770bd6769c6c --- /dev/null +++ b/metadata/xml-schema/projects.xsd @@ -0,0 +1,98 @@ +<?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="(mailto:[^@]+@[^.]+\..+|https?://.+)"/> + </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> |