<?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.14.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.griphyn.org/working_groups/VDS/vdl-1.14.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.14" 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:NMTOKEN">
			<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: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:NMTOKEN" use="required"/>
		<xs:attribute name="render" type="xs:string" use="optional"/>
		<xs:attribute name="link" type="LinkageType" use="optional"/>
	</xs:complexType>
	<xs:complexType name="ExecutionType" mixed="true">
		<xs:annotation>
			<xs:documentation>defines the type to be used for "executable" and pre/post scripts.</xs:documentation>
		</xs:annotation>
		<xs:sequence minOccurs="0">
			<xs:element name="lfn" type="ConstLFNType"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="DVScalarType" mixed="true">
		<xs:annotation>
			<xs:documentation>Mixed content allowing only "lfn" in derivations.</xs:documentation>
		</xs:annotation>
		<xs:sequence minOccurs="0">
			<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:sequence>
	</xs:complexType>
	<xs:complexType name="DVListType">
		<xs:annotation>
			<xs:documentation>List of mixed content allowing only "lfn" in derivations.</xs:documentation>
		</xs:annotation>
		<xs:sequence minOccurs="0" maxOccurs="unbounded">
			<xs:element name="item">
				<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:annotation>
						<xs:documentation>Mixed content allowing only "lfn" in derivations.</xs:documentation>
					</xs:annotation>
					<xs:sequence minOccurs="0">
						<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:sequence>
					<xs:attribute name="index" type="xs:nonNegativeInteger" use="optional"/>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<xs:element name="transformation">
		<xs:annotation>
			<xs:documentation>A "transformation" describes the specification of process environment with placeholders</xs:documentation>
		</xs:annotation>
		<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:sequence minOccurs="0" maxOccurs="unbounded">
					<xs:annotation>
						<xs:documentation>The parameter list to the "transformation" can contain any number of parameter declarations, which are placeholder for parameter passing.</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:annotation>
								<xs:documentation>For default values in transformations and derivation passed values.</xs:documentation>
							</xs:annotation>
							<xs:choice minOccurs="0">
								<xs:element name="scalar">
									<xs:complexType>
										<xs:complexContent>
											<xs:extension base="DVScalarType">
												<xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
											</xs:extension>
										</xs:complexContent>
									</xs:complexType>
								</xs:element>
								<xs:element name="list">
									<xs:complexType>
										<xs:complexContent>
											<xs:extension base="DVListType">
												<xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
											</xs:extension>
										</xs:complexContent>
									</xs:complexType>
								</xs:element>
							</xs:choice>
							<xs:attribute name="name" type="xs:NMTOKEN" 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: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="declare-temp" minOccurs="0" maxOccurs="unbounded">
						<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:annotation>
								<xs:documentation>Mixed content allowing only "use" in transformations.</xs:documentation>
							</xs:annotation>
							<xs:sequence minOccurs="0" maxOccurs="unbounded">
								<xs:element name="use" type="UseType"/>
							</xs:sequence>
							<xs:attribute name="name" type="xs:NMTOKEN" 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: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 minOccurs="0" maxOccurs="unbounded">
									<xs:annotation>
										<xs:documentation>Each invoked transformation will be passed the required argument list.</xs:documentation>
									</xs:annotation>
									<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:annotation>
															<xs:documentation>Mixed content allowing only "use" in transformations.</xs:documentation>
														</xs:annotation>
														<xs:sequence minOccurs="0" maxOccurs="unbounded">
															<xs:element name="use" type="UseType"/>
														</xs:sequence>
														<xs:attribute name="name" type="xs:NMTOKEN" 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="item">
																<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:annotation>
																		<xs:documentation>Mixed content allowing only "use" in transformations.</xs:documentation>
																	</xs:annotation>
																	<xs:sequence minOccurs="0" maxOccurs="unbounded">
																		<xs:element name="use" type="UseType"/>
																	</xs:sequence>
																	<xs:attribute name="index" type="xs:nonNegativeInteger" use="optional"/>
																</xs:complexType>
															</xs:element>
														</xs:sequence>
														<xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
													</xs:complexType>
												</xs:element>
											</xs:choice>
											<xs:attribute name="bind" type="xs:NMTOKEN" use="required"/>
											<xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
										</xs:complexType>
									</xs:element>
								</xs:sequence>
								<xs:attribute name="uses" type="xs:NMTOKEN" use="required"/>
								<xs:attribute name="name" type="xs:NMTOKEN" 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:complexContent mixed="true">
													<xs:extension base="ExecutionType">
														<xs:attribute name="universe" type="UniverseType" use="optional" default="scheduler"/>
													</xs:extension>
												</xs:complexContent>
											</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:complexContent mixed="true">
													<xs:extension base="ExecutionType">
														<xs:attribute name="universe" type="UniverseType" use="optional" default="vanilla"/>
													</xs:extension>
												</xs:complexContent>
											</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:complexContent mixed="true">
													<xs:extension base="ExecutionType">
														<xs:attribute name="universe" type="UniverseType" use="optional" default="scheduler"/>
													</xs:extension>
												</xs:complexContent>
											</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 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:NMTOKEN">
																		<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:NMTOKEN"/>
												<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: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:annotation>
								<xs:documentation>Mixed content allowing only "use" in transformations.</xs:documentation>
							</xs:annotation>
							<xs:sequence minOccurs="0" maxOccurs="unbounded">
								<xs:annotation>
									<xs:documentation>Mixed content allowing only "use" in transformations.</xs:documentation>
								</xs:annotation>
								<xs:element name="use" type="UseType"/>
							</xs:sequence>
							<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:NMTOKEN" 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:element>
	<xs:element name="derivation">
		<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 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 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:annotation>
							<xs:documentation>For default values in transformations and derivation passed values.</xs:documentation>
						</xs:annotation>
						<xs:choice>
							<xs:element name="scalar">
								<xs:complexType>
									<xs:complexContent>
										<xs:extension base="DVScalarType">
											<xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
										</xs:extension>
									</xs:complexContent>
								</xs:complexType>
							</xs:element>
							<xs:element name="list">
								<xs:complexType>
									<xs:complexContent>
										<xs:extension base="DVListType">
											<xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
										</xs:extension>
									</xs:complexContent>
								</xs:complexType>
							</xs:element>
						</xs:choice>
						<xs:attribute name="bind" type="xs:NMTOKEN" use="required"/>
						<xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
			<xs:attribute name="uses" type="xs:NMTOKEN" 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:NMTOKEN" use="optional"/>
			<xs:attribute name="vdlns" type="xs:string" use="optional"/>
			<xs:attributeGroup ref="DescriptionAG"/>
		</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 ref="transformation"/>
				<xs:element ref="derivation"/>
			</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>
