<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XML Spy v4.3 U (http://www.xmlspy.com) by Jens-S. Vöckler (private) -->
<xs:schema targetNamespace="http://www.griphyn.org/working_groups/VDS/vdl-1.13.xsd" xmlns="http://www.griphyn.org/working_groups/VDS/vdl-1.13.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.13" xml:lang="en">
	<xs:annotation>
		<xs:documentation>This XML Schema allows to validate either complete VDL scripts, or VDL "chunk" elements that are used with parameter files and command line arguments.</xs:documentation>
	</xs:annotation>
	<xs:simpleType name="ContainerType">
		<xs:annotation>
			<xs:documentation>defines the three basic containers for parameters.</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="scalar"/>
			<xs:enumeration value="list"/>
			<xs:enumeration value="hash"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="UniverseType">
		<xs:annotation>
			<xs:documentation>defines the usable Condor universes.</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="scheduler"/>
			<xs:enumeration value="vanilla"/>
			<xs:enumeration value="standard"/>
			<xs:enumeration value="globus"/>
			<xs:enumeration value="pvm"/>
			<xs:enumeration value="mpi"/>
			<xs:enumeration value="java"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="LinkageType">
		<xs:annotation>
			<xs:documentation>defines the usage of a logical filename.</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="input"/>
			<xs:enumeration value="output"/>
			<xs:enumeration value="inout"/>
			<xs:enumeration value="none"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="ProfileNamespace">
		<xs:annotation>
			<xs:documentation>defines the legal namespaces of execution profiles.</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:token">
			<xs:enumeration value="vds"/>
			<xs:enumeration value="condor"/>
			<xs:enumeration value="dagman"/>
			<xs:enumeration value="env"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:attributeGroup name="DescriptionAG">
		<xs:annotation>
			<xs:documentation>describe a tranformation or derivation with metadata.</xs:documentation>
		</xs:annotation>
		<xs:attribute name="description" type="xs:string" use="optional"/>
		<xs:attribute name="title" type="xs:string" use="optional"/>
		<xs:attribute name="keyword" type="xs:string" use="optional"/>
		<xs:attribute name="url" type="xs:anyURI" use="optional"/>
	</xs:attributeGroup>
	<xs:group name="TransformationGroup">
		<xs:annotation>
			<xs:documentation>Mixed content allowing only "use" in transformations.</xs:documentation>
		</xs:annotation>
		<xs:choice>
			<xs:element name="use" type="UseType"/>
		</xs:choice>
	</xs:group>
	<xs:group name="ApplicationGroup">
		<xs:annotation>
			<xs:documentation>Mixed content, limited to "lfn".</xs:documentation>
		</xs:annotation>
		<xs:choice>
			<xs:element name="lfn" type="ConstLFNType"/>
		</xs:choice>
	</xs:group>
	<xs:group name="DerivationGroup">
		<xs:annotation>
			<xs:documentation>Mixed content allowing only "lfn" in derivations.</xs:documentation>
		</xs:annotation>
		<xs:choice>
			<xs:annotation>
				<xs:documentation>You can use either pure text or the "lfn" element. Mixed content allows mixing, but you should not mix.</xs:documentation>
			</xs:annotation>
			<xs:element name="lfn" type="LFNType"/>
		</xs:choice>
	</xs:group>
	<xs:group name="ParameterGroup">
		<xs:annotation>
			<xs:documentation>For default values in transformations and derivation passed values.</xs:documentation>
		</xs:annotation>
		<xs:choice>
			<xs:element name="scalar">
				<xs:complexType mixed="true">
					<xs:group ref="DerivationGroup" minOccurs="0"/>
					<xs:attribute name="name" type="xs:token" use="optional"/>
				</xs:complexType>
			</xs:element>
			<xs:element name="list">
				<xs:complexType>
					<xs:sequence minOccurs="0" maxOccurs="unbounded">
						<xs:element name="i">
							<xs:annotation>
								<xs:documentation>Each element in a list may have an optional index for sparse vectors.</xs:documentation>
							</xs:annotation>
							<xs:complexType mixed="true">
								<xs:group ref="DerivationGroup" minOccurs="0"/>
								<xs:attribute name="index" type="xs:unsignedInt" use="optional"/>
							</xs:complexType>
						</xs:element>
					</xs:sequence>
					<xs:attribute name="name" type="xs:token" use="optional"/>
				</xs:complexType>
			</xs:element>
		</xs:choice>
	</xs:group>
	<xs:complexType name="LFNType">
		<xs:annotation>
			<xs:documentation>defines the type to be used for "lfn" elements.</xs:documentation>
		</xs:annotation>
		<xs:attribute name="file" type="xs:string" use="required"/>
		<xs:attribute name="link" type="LinkageType" use="required"/>
	</xs:complexType>
	<xs:complexType name="ConstLFNType">
		<xs:annotation>
			<xs:documentation>defines the type to be used for "lfn" constants in transformations.</xs:documentation>
		</xs:annotation>
		<xs:attribute name="file" type="xs:string" use="required"/>
		<xs:attribute name="link" use="required">
			<xs:simpleType>
				<xs:restriction base="LinkageType">
					<xs:enumeration value="input"/>
					<xs:enumeration value="none"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
	</xs:complexType>
	<xs:complexType name="UseType">
		<xs:annotation>
			<xs:documentation>defines the type to be used for "use" elements.</xs:documentation>
		</xs:annotation>
		<xs:attribute name="name" type="xs:token" use="required"/>
		<xs:attribute name="render" type="xs:string" use="optional"/>
		<xs:attribute name="link" type="LinkageType" use="optional"/>
	</xs:complexType>
	<xs:complexType name="TransformationType">
		<xs:annotation>
			<xs:documentation>A "transformation" describes the specification of process environment with placeholders</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="formal-parameter">
				<xs:annotation>
					<xs:documentation>A "transformation" contains declarations of placeholders for argument passing. This element must occur, even if the list is empty.</xs:documentation>
				</xs:annotation>
				<xs:complexType>
					<xs:sequence minOccurs="0" maxOccurs="unbounded">
						<xs:annotation>
							<xs:documentation>The parameter list can contain any number of parameter declarations.</xs:documentation>
						</xs:annotation>
						<xs:element name="declare">
							<xs:annotation>
								<xs:documentation>Each parameter is declared using the "declare" element, specifying the name and container type.</xs:documentation>
							</xs:annotation>
							<xs:complexType>
								<xs:group ref="ParameterGroup" minOccurs="0"/>
								<xs:attribute name="name" type="xs:token" use="required"/>
								<xs:attribute name="link" type="LinkageType" use="required"/>
								<xs:attribute name="container" type="ContainerType" default="scalar"/>
								<xs:attribute name="vdlns" type="xs:string" use="optional"/>
							</xs:complexType>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
			<xs:sequence>
				<xs:annotation>
					<xs:documentation>The only mandatory part is the spec of an executable, or another transformation to invoke.</xs:documentation>
				</xs:annotation>
				<xs:element name="temporary" minOccurs="0">
					<xs:annotation>
						<xs:documentation>The temporary section, if used, bind one of more variables with a logical temporary filename.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence maxOccurs="unbounded">
							<xs:element name="declare">
								<xs:annotation>
									<xs:documentation>Temporary declarations only provide bindings between parameter and temp. lfns. No other container types are allowed.</xs:documentation>
								</xs:annotation>
								<xs:complexType mixed="true">
									<xs:group ref="TransformationGroup" minOccurs="0" maxOccurs="unbounded"/>
									<xs:attribute name="name" type="xs:token" use="required"/>
									<xs:attribute name="link" type="LinkageType"/>
									<xs:attribute name="container" type="ContainerType" use="optional" fixed="scalar"/>
									<xs:attribute name="vdlns" type="xs:string" use="optional"/>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
						<xs:attribute name="vdlns" type="xs:string" use="optional"/>
					</xs:complexType>
				</xs:element>
				<xs:choice>
					<xs:annotation>
						<xs:documentation>A transformation is either simple or a compound transformation.</xs:documentation>
					</xs:annotation>
					<xs:element name="call" maxOccurs="unbounded">
						<xs:annotation>
							<xs:documentation>A compound transformation consists of one or more calls to other transformations.</xs:documentation>
						</xs:annotation>
						<xs:complexType>
							<xs:sequence>
								<xs:element name="actual-parameter">
									<xs:annotation>
										<xs:documentation>Each invoked transformation will be passed the required argument list.</xs:documentation>
									</xs:annotation>
									<xs:complexType>
										<xs:sequence minOccurs="0" maxOccurs="unbounded">
											<xs:element name="pass">
												<xs:annotation>
													<xs:documentation>The "pass" element established the binding between an actual parameter with its named formal counterpart.</xs:documentation>
												</xs:annotation>
												<xs:complexType>
													<xs:choice>
														<xs:annotation>
															<xs:documentation>The container type of the formal arg must match the chosen content container.</xs:documentation>
														</xs:annotation>
														<xs:element name="scalar">
															<xs:complexType mixed="true">
																<xs:group ref="TransformationGroup" minOccurs="0" maxOccurs="unbounded"/>
																<xs:attribute name="name" type="xs:token" use="optional"/>
															</xs:complexType>
														</xs:element>
														<xs:element name="list">
															<xs:annotation>
																<xs:documentation>A lists consists of zero or more "i" items.</xs:documentation>
															</xs:annotation>
															<xs:complexType>
																<xs:sequence minOccurs="0" maxOccurs="unbounded">
																	<xs:element name="i">
																		<xs:annotation>
																			<xs:documentation>Each element in a list may have an optional index for sparse vectors.</xs:documentation>
																		</xs:annotation>
																		<xs:complexType mixed="true">
																			<xs:group ref="TransformationGroup" minOccurs="0" maxOccurs="unbounded"/>
																			<xs:attribute name="index" type="xs:unsignedInt" use="optional"/>
																		</xs:complexType>
																	</xs:element>
																</xs:sequence>
																<xs:attribute name="name" type="xs:token" use="optional"/>
															</xs:complexType>
														</xs:element>
													</xs:choice>
													<xs:attribute name="bind" type="xs:token" use="required"/>
													<xs:attribute name="name" type="xs:token" use="optional"/>
												</xs:complexType>
											</xs:element>
										</xs:sequence>
									</xs:complexType>
								</xs:element>
							</xs:sequence>
							<xs:attribute name="uses" type="xs:token" use="required"/>
							<xs:attribute name="name" type="xs:token" use="optional"/>
							<xs:attribute name="vdlns" type="xs:string" use="optional"/>
							<xs:attribute name="minIncludeVersion" type="xs:string" default='"unbounded"'/>
							<xs:attribute name="maxIncludeVersion" type="xs:string" default='"unbounded"'/>
						</xs:complexType>
					</xs:element>
					<xs:sequence>
						<xs:annotation>
							<xs:documentation>A simple transformation consists of an executable with optional command line arguments.</xs:documentation>
						</xs:annotation>
						<xs:element name="application">
							<xs:annotation>
								<xs:documentation>Any application must contain an executable, but may also feature DAGMan pre- and postscripts.</xs:documentation>
							</xs:annotation>
							<xs:complexType>
								<xs:sequence>
									<xs:element name="pre-script" minOccurs="0">
										<xs:annotation>
											<xs:documentation>An optional DAGMan prescript to run in scheduler universe.</xs:documentation>
										</xs:annotation>
										<xs:complexType mixed="true">
											<xs:group ref="ApplicationGroup" minOccurs="0"/>
											<xs:attribute name="universe" type="UniverseType" default="scheduler"/>
										</xs:complexType>
									</xs:element>
									<xs:element name="executable">
										<xs:annotation>
											<xs:documentation>The name of the executable itself.</xs:documentation>
										</xs:annotation>
										<xs:complexType mixed="true">
											<xs:group ref="ApplicationGroup" minOccurs="0"/>
											<xs:attribute name="universe" type="UniverseType" default="vanilla"/>
										</xs:complexType>
									</xs:element>
									<xs:element name="post-script" minOccurs="0">
										<xs:annotation>
											<xs:documentation>An optional DAGMan postscript to run in scheduler universe.</xs:documentation>
										</xs:annotation>
										<xs:complexType mixed="true">
											<xs:group ref="ApplicationGroup" minOccurs="0"/>
											<xs:attribute name="universe" type="UniverseType" default="scheduler"/>
										</xs:complexType>
									</xs:element>
								</xs:sequence>
							</xs:complexType>
						</xs:element>
						<xs:element name="argument" minOccurs="0">
							<xs:annotation>
								<xs:documentation>A command line argument spec consists of an arbitrary number of namable chunks.</xs:documentation>
							</xs:annotation>
							<xs:complexType>
								<xs:sequence maxOccurs="unbounded">
									<xs:element ref="chunk"/>
								</xs:sequence>
							</xs:complexType>
						</xs:element>
					</xs:sequence>
				</xs:choice>
				<xs:element name="profile" minOccurs="0" maxOccurs="unbounded">
					<xs:annotation>
						<xs:documentation>Each "profile" element declares one DAGMan, Condor, or Unix envronment variable.</xs:documentation>
					</xs:annotation>
					<xs:complexType mixed="true">
						<xs:group ref="TransformationGroup"/>
						<xs:attribute name="key" type="xs:string" use="required"/>
						<xs:attribute name="namespace" type="ProfileNamespace" use="required"/>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:sequence>
		<xs:attribute name="name" type="xs:token" use="required"/>
		<xs:attribute name="version" type="xs:string" use="optional"/>
		<xs:attribute name="vdlns" type="xs:string" use="optional"/>
		<xs:attributeGroup ref="DescriptionAG"/>
	</xs:complexType>
	<xs:complexType name="DerivationType">
		<xs:annotation>
			<xs:documentation>A "derivation" makes use of previous or outside transformations, and fills the placeholders with specific values.</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="actual-parameter">
				<xs:annotation>
					<xs:documentation>A "derivation" contains actual parameters. This element must occur, even if the list is empty.</xs:documentation>
				</xs:annotation>
				<xs:complexType>
					<xs:sequence minOccurs="0" maxOccurs="unbounded">
						<xs:element name="pass">
							<xs:annotation>
								<xs:documentation>The "pass" element established the binding between an actual parameter with its named formal counterpart.</xs:documentation>
							</xs:annotation>
							<xs:complexType>
								<xs:group ref="ParameterGroup"/>
								<xs:attribute name="bind" type="xs:token" use="required"/>
								<xs:attribute name="name" type="xs:token" use="optional"/>
							</xs:complexType>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="uses" type="xs:token" use="required"/>
		<xs:attribute name="maxIncludeVersion" type="xs:string" use="optional"/>
		<xs:attribute name="minIncludeVersion" type="xs:string" use="optional"/>
		<xs:attribute name="name" type="xs:token" use="optional"/>
		<xs:attribute name="vdlns" type="xs:string" use="optional"/>
		<xs:attributeGroup ref="DescriptionAG"/>
	</xs:complexType>
	<xs:element name="chunk">
		<xs:annotation>
			<xs:documentation>A "chunk" describes an arbitrary, namable piece of a parameter file or command line arg for an executable.</xs:documentation>
		</xs:annotation>
		<xs:complexType mixed="true">
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:annotation>
					<xs:documentation>Each chunk may contain an arbitrary number of variable references "use", explicit logical filenames "lfn" and rendering instructions "br".</xs:documentation>
				</xs:annotation>
				<xs:element name="use" type="UseType">
					<xs:annotation>
						<xs:documentation>"use" references a bound parameter.</xs:documentation>
					</xs:annotation>
				</xs:element>
				<xs:element name="br">
					<xs:annotation>
						<xs:documentation>"br" is a whitespace mark-up tag for chunk rendering.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:annotation>
							<xs:documentation>visual markup</xs:documentation>
						</xs:annotation>
						<xs:attribute name="ws" default="crlf">
							<xs:simpleType>
								<xs:restriction base="xs:token">
									<xs:enumeration value="crlf"/>
									<xs:enumeration value="cr"/>
									<xs:enumeration value="lf"/>
									<xs:enumeration value="sp"/>
									<xs:enumeration value="ht"/>
									<xs:enumeration value="vt"/>
									<xs:enumeration value="ff"/>
								</xs:restriction>
							</xs:simpleType>
						</xs:attribute>
					</xs:complexType>
				</xs:element>
			</xs:choice>
			<xs:attribute name="name" type="xs:token"/>
			<xs:attribute name="render" type="xs:string">
				<xs:annotation>
					<xs:appinfo>Experimental feature, very unsure about this!</xs:appinfo>
				</xs:annotation>
			</xs:attribute>
		</xs:complexType>
	</xs:element>
	<xs:element name="definitions">
		<xs:annotation>
			<xs:documentation>The virtual data modification language.</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:annotation>
					<xs:documentation>A VDL document consists of any number of "transformation" and "derivation" elements in arbitrary order.</xs:documentation>
				</xs:annotation>
				<xs:element name="transformation" type="TransformationType"/>
				<xs:element name="derivation" type="DerivationType"/>
			</xs:choice>
			<xs:attribute name="version" type="xs:string" use="required"/>
			<xs:attribute name="vdlns" type="xs:string" use="optional"/>
		</xs:complexType>
	</xs:element>
</xs:schema>
