<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<!-- the actual elements -->
	<xs:include schemaLocation="elementproperties.xsd"/>
	<xs:include schemaLocation="positioning.xsd"/>
	<xs:include schemaLocation="sectors.xsd"/>
	<xs:include schemaLocation="initial.xsd"/>
	<!-- following the specs, we define an element that will be the container for -->
	<!-- elementroot and orientation tag -->
	<xs:element name="element">
		<xs:complexType>
			<xs:sequence minOccurs="1" maxOccurs="unbounded">
				<xs:element ref="elementroot" minOccurs="0" maxOccurs="1"/>
				<xs:element ref="orientation" minOccurs="0" maxOccurs="1"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:ID"/>
			<xs:attribute name="ref" type="xs:IDREF"/>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="elementroottype">
		<!-- I use unbounded sequence to be able to specify tags in any order -->
		<!-- I then constraint cardinality of childs explicitely. -->
		<xs:sequence minOccurs="0" maxOccurs="unbounded">
			<xs:element ref="description" minOccurs="0" maxOccurs="1"/>
			<xs:element name="state" type="statetype" default="ON" minOccurs="0" maxOccurs="1"/>
			<xs:element ref="length" minOccurs="0" maxOccurs="1"/>
		</xs:sequence>
		<xs:attribute name="name" type="xs:ID" use="required"/>
		<xs:attribute name="ref" type="xs:IDREF"/>
	</xs:complexType>
	<xs:element name="length">
		<xs:complexType>
			<xs:attribute name="value" type="arglist" default="0.0"/>
		</xs:complexType>
	</xs:element>
	<!-- we root the hierarchy to an abstract element -->
	<!-- and we extend the root elementroottype to include -->
	<!-- element specific childs -->
	<xs:element name="elementroot" abstract="true"/>
	<!-- quadrupole, p 31 4.18 -->
	<xs:element name="quadrupole" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence maxOccurs="unbounded">
						<xs:element ref="multipole" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="kicks" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
						<xs:element ref="methods" minOccurs="0" maxOccurs="1"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<!-- bend, p 36,37 4.3 -->
	<xs:element name="bend" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence maxOccurs="unbounded">
						<xs:element ref="poleface" minOccurs="1" maxOccurs="1"/>
						<xs:element name="g" type="arglist" minOccurs="1" maxOccurs="1"/>
						<xs:element ref="multipole" minOccurs="1" maxOccurs="1"/>
						<xs:element ref="kicks" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="methods" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
						<xs:element name="delta_g" type="arglist" minOccurs="0" maxOccurs="1"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<!-- collimator, p 26 4.4 -->
	<xs:element name="collimator" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence maxOccurs="unbounded">
						<xs:element ref="methods" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<!-- drift, p 27 4.6 -->
	<xs:element name="drift" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence maxOccurs="unbounded">
						<xs:element ref="methods" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<!-- elseparator, p 27 4.7 -->
	<xs:element name="elseparator" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence maxOccurs="unbounded">
						<xs:element ref="multipole" minOccurs="1" maxOccurs="1"/>
						<xs:choice maxOccurs="1">
							<xs:group ref="gapvoltage"/>
							<xs:element ref="kicks"/>
						</xs:choice>
						<xs:element ref="methods" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:group name="gapvoltage">
		<xs:sequence>
			<xs:element name="voltage" type="arglist"/>
			<xs:element name="gap" type="arglist"/>
		</xs:sequence>
	</xs:group>
	<!-- custom, p 27 4.5 -->
	<xs:element name="custom" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence maxOccurs="unbounded">
						<xs:element name="delta_e" type="valuetype"/>
						<xs:element name="custom" type="xs:string" minOccurs="1" maxOccurs="1"/>
						<xs:element ref="methods" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<!-- IBEAM, p 28 4.8 -->
	<xs:element name="i_beam" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:sequence maxOccurs="unbounded">
				<xs:element ref="sector" minOccurs="0"/>
				<xs:element ref="orientation" minOccurs="0" maxOccurs="1"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:ID" use="required"/>
			<xs:attribute name="ref" type="xs:IDREF"/>
		</xs:complexType>
	</xs:element>
	<!-- instrument p 28 4.9 -->
	<xs:element name="instrument" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence maxOccurs="unbounded">
						<xs:element ref="methods" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<!-- monitor, p 28 4.9 -->
	<xs:element name="monitor" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence maxOccurs="unbounded">
						<xs:element ref="methods" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<!-- kicker p 29 4.10 -->
	<xs:element name="kicker" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence maxOccurs="unbounded">
						<xs:element ref="multipole" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="kicks" minOccurs="1" maxOccurs="1"/>
						<xs:element ref="methods" minOccurs="0" maxOccurs="1"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
					</xs:sequence>
					<xs:attribute name="value" type="arglist" use="required"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<!-- knob p 29 4.11 -->
	<xs:element name="knob" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence maxOccurs="unbounded">
						<xs:element ref="mode" minOccurs="1" maxOccurs="1"/>
						<xs:element ref="control" minOccurs="1" maxOccurs="1"/>
					</xs:sequence>
					<xs:attribute name="value" type="arglist" use="required"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:simpleType name="statetype">
		<xs:restriction base="xs:string">
			<xs:enumeration value="ON"/>
			<xs:enumeration value="OFF"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- Lcavity  p 30, 4.12 -->
	<xs:element name="Lcavity" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="RF"/>
				<xs:element ref="multipole" minOccurs="0"/>
				<xs:element ref="kicks" minOccurs="0"/>
				<xs:element ref="methods" minOccurs="0"/>
				<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
				<xs:element ref="wake" minOccurs="1"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<!--Marker  p 30 4.13 modified to optionally include twiss-->
	<xs:element name="marker" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="switchyard" type="xs:string" minOccurs="0"/>
				<xs:element ref="aperture" minOccurs="0"/>
				<xs:element ref="twiss" minOccurs="0"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<!-- multipole p31, 4.15 -->
	<xs:element name="Multipole" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
				<xs:element ref="multipole" minOccurs="0" maxOccurs="1"/>
				<xs:element name="length_radiation" type="valuetype" minOccurs="1"/>
				<xs:element ref="methods" minOccurs="0" maxOccurs="1"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<!-- octupole p31 4.16 -->
	<xs:element name="Octupole" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="multipole" minOccurs="0"/>
				<xs:element ref="kicks" minOccurs="0"/>
				<xs:element ref="methods" minOccurs="0"/>
				<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<!-- patch p 31 4.17 -->
	<xs:element name="Patch" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="energy_offset" type="valuetype"/>
				<xs:element ref="methods" minOccurs="0"/>
				<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<!-- RFcavity  p 32, 4.19 -->
	<xs:element name="RFcavity" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="RF"/>
				<xs:element ref="multipole" minOccurs="0"/>
				<xs:element ref="kicks" minOccurs="0"/>
				<xs:element ref="methods" minOccurs="0"/>
				<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
				<xs:element ref="wake" minOccurs="1"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<!-- sextupole p32 4.20 -->
	<xs:element name="Sextupole" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="multipole" minOccurs="0"/>
				<xs:element ref="kicks" minOccurs="0"/>
				<xs:element ref="methods" minOccurs="0"/>
				<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<!-- solenoid p32 4.21 -->
	<xs:element name="Solenoid" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="ks" type="valuetype" minOccurs="1" maxOccurs="1"/>
				<xs:element ref="multipole" minOccurs="0"/>
				<xs:element ref="kicks" minOccurs="0"/>
				<xs:element ref="methods" minOccurs="0"/>
				<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<!-- Sol_Quad p33 4.22 -->
	<xs:element name="Sol_Quad" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence>
						<xs:element name="orientation" type="orientationforsolquad" minOccurs="0"
							maxOccurs="2"/>
						<xs:element name="ks" type="valuetype" minOccurs="1" maxOccurs="1"/>
						<xs:element ref="multipole" minOccurs="1"/>
						<xs:element ref="kicks" minOccurs="0"/>
						<xs:element ref="methods" minOccurs="0"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="orientationforsolquad">
		<xs:complexContent>
			<xs:extension base="rootorientationtype">
				<xs:attribute name="who" type="whoforsolquad"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:simpleType name="whoforsolquad">
		<xs:restriction base="xs:string">
			<xs:enumeration value="SOLENOID"/>
			<xs:enumeration value="QUADRUPOLE"/>
			<xs:enumeration value="SOL_QUAD"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- Bend Sol_Quad p24 4.2 -->
	<xs:element name="Bend_Sol_Quad" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence>
						<xs:element name="orientation" type="orientationforbendsolquad"
							minOccurs="0" maxOccurs="3"/>
						<xs:element name="ks" type="valuetype" minOccurs="1" maxOccurs="1"/>
						<xs:element name="dks_ds" type="valuetype" minOccurs="1" maxOccurs="1"/>
						<xs:element name="g" type="valuetype" minOccurs="1" maxOccurs="1"/>
						<xs:element name="delta_g" type="valuetype" minOccurs="1" maxOccurs="1"/>
						<xs:element ref="multipole" minOccurs="1"/>
						<xs:element ref="kicks" minOccurs="0"/>
						<xs:element ref="methods" minOccurs="0"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="orientationforbendsolquad">
		<xs:complexContent>
			<xs:extension base="rootorientationtype">
				<xs:attribute name="who" type="whoforbendsolquad"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:simpleType name="whoforbendsolquad">
		<xs:restriction base="xs:string">
			<xs:enumeration value="BEND"/>
			<xs:enumeration value="SOLENOID"/>
			<xs:enumeration value="QUADRUPOLE"/>
			<xs:enumeration value="BEND_SOL_QUAD"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- Taylor p33 4.23 -->
	<!-- todo, define taylor map and taylor series properties -->
	<xs:element name="Taylor" substitutionGroup="elementroot">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="elementroottype">
					<xs:sequence>
						<xs:element ref="taylor_map" minOccurs="1" maxOccurs="1"/>
						<xs:element ref="methods" minOccurs="0"/>
						<xs:element ref="aperture" minOccurs="0" maxOccurs="2"/>
					</xs:sequence>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
</xs:schema>
