<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
	attributeFormDefault="unqualified" elementFormDefault="qualified"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
	xmlns="https://pub.ants.gouv.fr/2D-DOC/V2/QLF/05_XSD/1_AFNOR101/"
	targetNamespace="https://pub.ants.gouv.fr/2D-DOC/V2/QLF/05_XSD/1_AFNOR101/">

	<xs:import namespace="https://pub.ants.gouv.fr/2D-DOC/V2/QLF/05_XSD/1_AFNOR101/EXTENSIONS/" schemaLocation="http://pub.ants.gouv.fr/2D-DOC/V2/QLF/05_XSD/1_AFNOR101/EXTENSIONS/XSD_EXTENSIONS_AFNOR101_ANTS.xsd"/>
	<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
	<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"/>

	<xs:element name="Manifest" type="ManifestType">
		<xs:annotation>
			<xs:documentation>Root element for a Use Case descriptor.</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="FacultativeManifest" type="FacultativeManifestType">
		<xs:annotation>
			<xs:documentation>Facultative Manifest and Fields.</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="Id">
		<xs:annotation>
			<xs:documentation>Use Case unique identifier. Restriction: 2 chars</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:pattern value="[A-F0-9]{2}" />
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Version">
		<xs:annotation>
			<xs:documentation>Use Case version. To be incremented when a breaking change is introduced.Restriction: 1-255</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:pattern value="[0-9]{2}" />
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Name" type="NameType">
		<xs:annotation>
			<xs:documentation>Use Case name. Multilingual.Restriction: At least 1 name must be defined.</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="Description" type="DescriptionType">
		<xs:annotation>
			<xs:documentation>Use Case description. Multilingual.Restriction: At least 1 description must be defined.</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="Schema" type="SchemaType">
		<xs:annotation>
			<xs:documentation>Use Case data schema. Used to decode a VDS payload.Restriction: Exactly 1 schema MUST be defined.</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="Extensions" type="ExtensionsType">
		<xs:annotation>
			<xs:documentation>
			Defines an extension point where new features (proprietary or not) can be added.
			Default extensions are:
			- Policies: Validation policies
			- Presentation views: Templates used to render VDS content
			</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:complexType name="ValueType">
		<xs:annotation>
			<xs:documentation>
				Element used to define a translatable value. Translation is based on the xml:lang	provide, ie a 2 letter language code.
			</xs:documentation>
		</xs:annotation>
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute ref="xml:lang"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
	<xs:complexType name="FacultativeManifestType">
		<xs:sequence>
			<xs:element type="ValueType" name="Value" maxOccurs="unbounded" minOccurs="1" />
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NameType">
		<xs:sequence>
			<xs:element type="ValueType" name="Value" maxOccurs="unbounded" minOccurs="1" />
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="DescriptionType">
		<xs:sequence>
			<xs:element type="ValueType" name="Value" maxOccurs="unbounded" minOccurs="1" />
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="BaseConstraintsType" abstract="true">
		<xs:sequence>
			<xs:element type="xs:string" name="Nillable" nillable="true" minOccurs="0">
				<xs:annotation>
					<xs:documentation>Sets an element as Nillable. By default, an element is not nillable.</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="StringConstraintsType">
		<xs:annotation>
			<xs:documentation>Sets constraints on a String field.</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="BaseConstraintsType">
				<xs:sequence>
					<xs:choice minOccurs="0" maxOccurs="8">
						<xs:element name="Length" minOccurs="0">
							<xs:annotation>
								<xs:documentation>The field value encoding. If specified, the restrictions are validated against the decoded value.</xs:documentation>
							</xs:annotation>
							<xs:simpleType>
								<xs:restriction base="xs:string">
									<xs:enumeration value="fixed" />
									<xs:enumeration value="not fixed" />
								</xs:restriction>
							</xs:simpleType>
						</xs:element>
						<xs:element type="xs:unsignedInt" name="MinLength" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Minimum string length. Optional. Values from 0 to 4,294,967,295.</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:unsignedInt" name="MaxLength" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Maximum string length. Optional. Values from 0 to 4,294,967,295.</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:string" name="Pattern" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Allowed string pattern. Supports JavaScript RegEx. Optional.</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:string" name="Dependency" minOccurs="0">
							<xs:annotation>
								<xs:documentation>If Field A is present, Fild B must be present too</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:string" name="OR" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Field A or Field B or Field A+B</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:string" name="XOR" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Field A or Field B</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element name="Encoding" minOccurs="0">
							<xs:annotation>
								<xs:documentation>The field value encoding. If specified, the restrictions are validated against the decoded value.</xs:documentation>
							</xs:annotation>
							<xs:simpleType>
								<xs:restriction base="xs:string">
									<xs:enumeration value="BASE32" />
									<xs:enumeration value="BASE64" />
									<xs:enumeration value="C40" />
								</xs:restriction>
							</xs:simpleType>
						</xs:element>
					</xs:choice>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="TypeDef" abstract="true">
		<xs:annotation>
			<xs:documentation>Base entity for a schema field.</xs:documentation>
		</xs:annotation>
		<xs:attribute type="xs:string" name="name" use="required">
			<xs:annotation>
				<xs:documentation>Field name. Required</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>
	<xs:complexType name="StringType">
		<xs:annotation>
			<xs:documentation>Field representing a sequence of characters.Restrictions can be applied using StringConStraints element.</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="TypeDef">
				<xs:sequence>
					<xs:element type="ValueType" name="Value" minOccurs="1">
						<xs:annotation>
							<xs:documentation>Value. Optional.</xs:documentation>
						</xs:annotation>
					</xs:element>
					<xs:element type="StringConstraintsType" name="StringConstraints" minOccurs="0">
						<xs:annotation>
							<xs:documentation>Value restrictions. Optional.</xs:documentation>
						</xs:annotation>
					</xs:element>
					<xs:element name="Extension" minOccurs="0">
						<xs:annotation>
							<xs:documentation>Value restrictions. Optional.</xs:documentation>
						</xs:annotation>
					</xs:element>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="BooleanConstraintsType">
		<xs:annotation>
			<xs:documentation>Boolean field restrictions.</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="BaseConstraintsType" />
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="BooleanType">
		<xs:annotation>
			<xs:documentation> Booleanfield type.</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="TypeDef">
				<xs:sequence>
					<xs:element type="BooleanConstraintsType" name="BooleanConstraints" minOccurs="0">
						<xs:annotation>
							<xs:documentation>Boolean field restrictions.</xs:documentation>
						</xs:annotation>
					</xs:element>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="DateConstraintsType">
		<xs:annotation>
			<xs:documentation>Date field restrictions.</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="BaseConstraintsType">
				<xs:sequence>
					<xs:choice minOccurs="0" maxOccurs="11">
						<xs:element type="xs:date" name="NotBefore" minOccurs="0">
							<xs:annotation>
								<xs:documentation>
								Minimum date allowed. Optional.
								Date must have the following format: yyyy-MM-dd.
								</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:date" name="NotAfter" minOccurs="0">
							<xs:annotation>
								<xs:documentation>
								Maximum date allowed. Optional.
								Date must have the following format: yyyy-MM-dd.
								</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:date" name="From" minOccurs="0">
							<xs:annotation>
								<xs:documentation>
								Date from which to calculate the number of days. Optional. Must be
								a date format (yyyy-MM-dd)
								</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element name="Length" minOccurs="0">
							<xs:annotation>
								<xs:documentation>The field value encoding. If specified, the restrictions are validated against the decoded value.</xs:documentation>
							</xs:annotation>
							<xs:simpleType>
								<xs:restriction base="xs:string">
									<xs:enumeration value="fixed" />
									<xs:enumeration value="not fixed" />
								</xs:restriction>
							</xs:simpleType>
						</xs:element>
						<xs:element type="xs:string" name="DateType" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Allowed string pattern. Supports JavaScript RegEx. Optional.</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:string" name="DateFormat" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Allowed string pattern. Supports JavaScript RegEx. Optional.</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:unsignedInt" name="MinLength" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Minimum string length. Optional. Values from 0 to 4,294,967,295.</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:unsignedInt" name="MaxLength" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Maximum string length. Optional. Values from 0 to 4,294,967,295.</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:string" name="Pattern" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Allowed string pattern. Supports JavaScript RegEx. Optional.</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:string" name="Dependency" minOccurs="0">
							<xs:annotation>
								<xs:documentation>If Field A is present, Fild B must be present too</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:string" name="OR" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Field A or Field B or Field A+B</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element type="xs:string" name="XOR" minOccurs="0">
							<xs:annotation>
								<xs:documentation>Field A or Field B</xs:documentation>
							</xs:annotation>
						</xs:element>
						<xs:element name="Encoding" minOccurs="0">
							<xs:annotation>
								<xs:documentation>The field value encoding. If specified, the restrictions are validated against the decoded value.</xs:documentation>
							</xs:annotation>
							<xs:simpleType>
								<xs:restriction base="xs:string">
									<xs:enumeration value="BASE32" />
									<xs:enumeration value="BASE64" />
									<xs:enumeration value="C40" />
								</xs:restriction>
							</xs:simpleType>
						</xs:element>
					</xs:choice>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="DateType">
		<xs:annotation>
			<xs:documentation>
			Date type field. Represents the number of days from 2000-01-01, to a
			maximum of 65535 days (2 bytes).
			</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="TypeDef">
				<xs:sequence>
					<xs:element type="ValueType" name="Value" minOccurs="1">
						<xs:annotation>
							<xs:documentation>Value. Optional.</xs:documentation>
						</xs:annotation>
					</xs:element>
					<xs:element type="DateConstraintsType" name="DateConstraints" minOccurs="0">
						<xs:annotation>
							<xs:documentation>Date field restrictions. Optional</xs:documentation>
						</xs:annotation>
					</xs:element>
					<xs:element name="Extension" minOccurs="0">
						<xs:annotation>
							<xs:documentation>Value restrictions. Optional.</xs:documentation>
						</xs:annotation>
					</xs:element>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="PayloadType">
		<xs:sequence>
			<xs:element type="FieldsType" name="Fields">
				<xs:annotation>
					<xs:documentation>
					List of fields defined in the payload.
					</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="AuxDataType">
		<xs:sequence>
			<xs:element type="FieldsType" name="Fields" minOccurs="0">
				<xs:annotation>
					<xs:documentation>
					List of fields defined in the Auxiliary Data. Optional.
					If not specified, this means there are no auxiliary data.
					</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="FieldsType">
		<xs:choice minOccurs="0" maxOccurs="unbounded">
			<xs:element type="StringType" name="String" maxOccurs="unbounded" minOccurs="0" />
			<xs:element type="BooleanType" name="Boolean" maxOccurs="unbounded" minOccurs="0" />
			<xs:element type="DateType" name="Date" maxOccurs="unbounded" minOccurs="0" />
		</xs:choice>
	</xs:complexType>
	<xs:complexType name="SchemaType">
		<xs:sequence>
				<xs:element type="PayloadType" name="Payload">
					<xs:annotation>
						<xs:documentation>
						Payload definition
						</xs:documentation>
					</xs:annotation>
				</xs:element>
				<xs:element type="AuxDataType" name="AuxData" minOccurs="0">
					<xs:annotation>
						<xs:documentation>
						Auxiliary Data definition. Optional
						</xs:documentation>
					</xs:annotation>
				</xs:element>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="ExtensionType" abstract="true">
		<xs:annotation>
			<xs:documentation>
			Base type for an extension.
			</xs:documentation>
		</xs:annotation>
	</xs:complexType>
	<xs:complexType name="ExtensionsType">
		<xs:sequence>
			<xs:element type="ExtensionType" name="Extension" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="ManifestType">
		<xs:sequence>
			<xs:element ref="FacultativeManifest" minOccurs="0"/>
			<xs:element ref="Id" />
			<xs:element ref="Version" />
			<xs:element ref="Name" />
			<xs:element ref="Description" />
			<xs:element ref="Schema" />
			<xs:element ref="Extensions" minOccurs="0"/>
		</xs:sequence>
		<xs:attribute type="xs:int" name="version" use="required" fixed="1">
			<xs:annotation>
				<xs:documentation>
					Manifest format version. MUST be 1.
				</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>
	<!-- Abbreviation extension -->
	<xs:complexType name="Abbreviation">
		<xs:sequence>
			<xs:element name="Dictionary" maxOccurs="1"	minOccurs="1"/>
		</xs:sequence>
	</xs:complexType>
	<!-- Directories extension -->
	<xs:complexType name="DictionariesExtension">
		<xs:sequence>
			<xs:element type="DictionaryType" name="Dictionary"	maxOccurs="unbounded" minOccurs="1"/>
		</xs:sequence>
	</xs:complexType>
	<!-- Dictionary Entry -->
	<xs:complexType name="DictionaryType">
		<xs:sequence>
			<xs:element type="EntryType" name="Entry" maxOccurs="unbounded"	minOccurs="1"/>
		</xs:sequence>
		<xs:attribute type="xs:ID" name="name" use="required"/>
	</xs:complexType>
	<!-- Entry Entry -->
	<xs:complexType name="EntryType">
		<xs:sequence>
			<xs:element type="ValueType" name="Value" maxOccurs="unbounded"	minOccurs="1"/>
		</xs:sequence>
		<xs:attribute name="key" type="xs:string" use="required"/>
	</xs:complexType>
</xs:schema>