Skip to content
dellch edited this page Jul 20, 2018 · 3 revisions
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
		xmlns:xsd="http://www.w3.org/2001/XMLSchema"
		xmlns:sp="http://tolkin.org/service-provider"
		targetNamespace="http://tolkin.org/service-provider"
		elementFormDefault="qualified"
		attributeFormDefault="unqualified">
	<xsd:annotation>
		<xsd:documentation>
			Schema for service provider description document.
		</xsd:documentation>
	</xsd:annotation>

	<xsd:element name="service-provider">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="types" type="sp:TypesType" minOccurs="1" maxOccurs="unbounded"/>
				<!-- Type translation functionality is optional -->
				<xsd:element name="type-translation" type="sp:TypeTranslationType" 
					minOccurs="0" maxOccurs="unbounded"/>
				<xsd:element ref="sp:program" minOccurs="1" maxOccurs="unbounded"/>
			</xsd:sequence>
		</xsd:complexType>

		<!-- Type name must be unique -->
		<xsd:unique name="typeNameUnique">
			<xsd:selector xpath="sp:types/sp:type"/>
			<xsd:field xpath="@name"/>
		</xsd:unique>

		<!-- Program name must be unique -->
		<xsd:unique name="programNameUnique">
			<xsd:selector xpath="sp:program"/>
			<xsd:field xpath="@name"/>
		</xsd:unique>

		<xsd:key name="typeNameKey">
			<xsd:selector xpath="sp:types/sp:type"/>
			<xsd:field xpath="@name"/>
		</xsd:key>

		<!-- The from and to attribute of type-translation 
		     must come from existing types -->
		<xsd:keyref name="fromKeyRef" refer="sp:typeNameKey">
			<xsd:selector xpath="sp:type-translation"/>
			<xsd:field xpath="@from"/>
		</xsd:keyref>

		<xsd:keyref name="toKeyRef" refer="sp:typeNameKey">
			<xsd:selector xpath="sp:type-translation"/>
			<xsd:field xpath="@to"/>
		</xsd:keyref>

		<xsd:keyref name="acceptTypeRef" refer="sp:typeNameKey">
			<xsd:selector xpath="sp:program/sp:input/sp:accept-type"/>
			<xsd:field xpath="@name"/>
		</xsd:keyref>

		<xsd:keyref name="alternativeTypeRef" refer="sp:typeNameKey">
			<xsd:selector xpath="sp:program/sp:output/sp:alternative-type"/>
			<xsd:field xpath="@name"/>
		</xsd:keyref>
	</xsd:element>

	<xsd:complexType name="TypeType">
		<xsd:simpleContent>
			<xsd:extension base="xsd:string">
				<xsd:attribute name="name" type="xsd:string" use="required"/>
			</xsd:extension>	
		</xsd:simpleContent>
	</xsd:complexType>

	<xsd:complexType name="TypesType">
		<xsd:sequence>
			<xsd:element name="type" type="sp:TypeType" minOccurs="1" maxOccurs="unbounded"/>
		</xsd:sequence>
	</xsd:complexType>

	<!-- An empty type with two attributes from and to -->
	<xsd:complexType name="TypeTranslationType">
		<xsd:attribute name="from" type="xsd:string" use="required"/>
		<xsd:attribute name="to" type="xsd:string" use="required"/>
	</xsd:complexType>

	<xsd:element name="program" type="sp:ProgramType">
		<!-- Input name must be unique  -->
		<xsd:unique name="inputNameUnique">
			<xsd:selector xpath="sp:program/sp:input"/>
			<xsd:field xpath="@name"/>
		</xsd:unique>

		<!-- Parameter name must be unique -->
		<xsd:unique name="parameterNameUnique">
			<xsd:selector xpath="sp:program/sp:parameter"/>
			<xsd:field xpath="@name"/>
		</xsd:unique>

		<!-- Output name must be unique -->
		<xsd:unique name="outputNameUnique">
			<xsd:selector xpath="sp:program/sp:output"/>
			<xsd:field xpath="@name"/>
		</xsd:unique>
	</xsd:element>

	<xsd:complexType name="ProgramType">
		<xsd:sequence>
			<xsd:element name="comment" type="xsd:string" minOccurs="0" maxOccurs="1"/>
			<xsd:element name="input" type="sp:InputType" minOccurs="0" maxOccurs="unbounded"/>
			<xsd:element name="parameter" type="sp:ParameterType" minOccurs="0" maxOccurs="unbounded"/>
			<!-- A program must produce at least one output -->
			<xsd:element name="output" type="sp:OutputType" minOccurs="1" maxOccurs="unbounded"/>
		</xsd:sequence>
		<xsd:attribute name="name" type="xsd:string" use="required"/>
		<xsd:attribute name="group" type="xsd:string" use="required"/>
	</xsd:complexType>

	<xsd:complexType name="InputType">
		<xsd:sequence>
			<xsd:element name="comment" type="xsd:string" minOccurs="0" maxOccurs="1"/>
			<xsd:element name="alternative-type" type="sp:AlternativeTypeType" 
				minOccurs="0" maxOccurs="unbounded"/>
		</xsd:sequence>
		<xsd:attribute name="name" type="xsd:string" use="required"/>
		<xsd:attribute name="type" type="xsd:string" use="required"/>
		<xsd:attribute name="optional" type="xsd:boolean" default="true"/>
	</xsd:complexType>

	<xsd:complexType name="ParameterType" abstract="true">
		<xsd:sequence>
			<xsd:element name="comment" type="xsd:string" minOccurs="0" maxOccurs="1"/>
		</xsd:sequence>
		<xsd:attribute name="name" type="xsd:string" use="required"/>
		<xsd:attribute name="optional" type="xsd:boolean" default="true"/>
	</xsd:complexType>

	<xsd:complexType name="IntegerParameter">
		<xsd:complexContent>
			<xsd:extension base="sp:ParameterType">
				<xsd:attribute name="default" type="xsd:integer" use="optional"/>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="DoubleParameter">
		<xsd:complexContent>
			<xsd:extension base="sp:ParameterType">
				<xsd:attribute name="default" type="xsd:double" use="optional"/>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="BooleanParameter">
		<xsd:complexContent>
			<xsd:extension base="sp:ParameterType">
				<xsd:attribute name="default" type="xsd:boolean" use="optional"/>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="StringParameter">
		<xsd:complexContent>
			<xsd:extension base="sp:ParameterType">
				<xsd:sequence>
					<xsd:element name="choice" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
				</xsd:sequence>
				<xsd:attribute name="default" type="xsd:string" use="optional"/>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="OutputType">
		<xsd:sequence>
			<xsd:element name="comment" type="xsd:string" minOccurs="0" maxOccurs="1"/>
			<xsd:element name="alternative-type" type="sp:AlternativeTypeType" 
				minOccurs="0" maxOccurs="unbounded"/>
		</xsd:sequence>
		<xsd:attribute name="name" type="xsd:string" use="required"/>
		<xsd:attribute name="type" type="xsd:string" use="required"/>
	</xsd:complexType>

	<xsd:complexType name="AlternativeTypeType">
		<xsd:attribute name="name" type="xsd:string" use="required"/>
	</xsd:complexType>
</xsd:schema>
Clone this wiki locally