<?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.17.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.griphyn.org/working_groups/VDS/vdl-1.17.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.17" xml:lang="en">
	<xs:annotation>
		<xs:documentation>This XML Schema allows to validate either complete VDL scripts, or specific VDL chunks.</xs:documentation>
	</xs:annotation>
	<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:attribute name="isTemporary" type="xs:boolean" use="optional" default="false"/>
		<xs:attribute name="temporaryHint" type="xs:string" use="optional"/>
	</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="postfix" type="xs:string" use="optional"/>
		<xs:attribute name="separator" type="xs:string" use="optional"/>
		<xs:attribute name="prefix" type="xs:string" use="optional"/>
		<xs:attribute name="link" type="LinkageType" use="optional"/>
	</xs:complexType>
	<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: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: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:element name="text" type="xs:string">
		<xs:annotation>
			<xs:documentation>A textual representation of verbatim values.</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="scalar">
		<xs:annotation>
			<xs:documentation>A simple element for text or files.</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<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:element ref="text"/>
			</xs:choice>
			<xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="list">
		<xs:annotation>
			<xs:documentation>A list element containing simple elements.</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<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 ref="scalar"/>
			</xs:sequence>
			<xs:attribute name="name" type="xs:NMTOKEN" use="optional"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="transformation">
		<xs:annotation>
			<xs:documentation>A "transformation" describes the specification of process environment with placeholders</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:annotation>
				<xs:documentation>A "transformation" describes the specification of process environment with placeholders</xs:documentation>
			</xs:annotation>
			<xs:sequence>
				<xs:element name="declare" minOccurs="0" maxOccurs="unbounded">
					<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:choice minOccurs="0">
							<xs:element ref="scalar"/>
							<xs:element ref="list"/>
						</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:complexType>
				</xs:element>
				<xs:element name="argument" minOccurs="0" maxOccurs="unbounded">
					<xs:annotation>
						<xs:documentation>A command line argument spec consists of an arbitrary number of namable chunks.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:choice maxOccurs="unbounded">
							<xs:element name="use" type="UseType">
								<xs:annotation>
									<xs:documentation>"use" references a bound parameter.</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element ref="text"/>
						</xs:choice>
						<xs:attribute name="name" type="xs:NMTOKEN"/>
					</xs:complexType>
				</xs:element>
				<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>
						<xs:annotation>
							<xs:documentation>Mixed content allowing only "use" in transformations.</xs:documentation>
						</xs:annotation>
						<xs:choice maxOccurs="unbounded">
							<xs:annotation>
								<xs:documentation>Mixed content allowing only "use" in transformations.</xs:documentation>
							</xs:annotation>
							<xs:element name="use" type="UseType"/>
							<xs:element ref="text"/>
						</xs:choice>
						<xs:attribute name="key" type="xs:string" use="required"/>
						<xs:attribute name="namespace" type="ProfileNamespace" use="required"/>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
			<xs:attribute name="name" type="xs:NMTOKEN" use="required"/>
			<xs:attribute name="version" type="xs:string" use="optional"/>
			<xs:attribute name="namespace" type="xs:string" use="optional"/>
			<xs:attribute name="pfnHint" type="xs:string" use="optional"/>
			<xs:attribute name="pfnUniverse" type="UniverseType" use="optional" default="vanilla"/>
			<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>
			<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:choice>
							<xs:element ref="scalar"/>
							<xs:element ref="list"/>
						</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="usesspace" type="xs:string" use="optional"/>
			<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="namespace" type="xs:string" use="optional"/>
			<xs:attribute name="version" 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>
