<?xml version="1.0"?>
<!-- edited with XMLSPY v2004 rel. 2 U (http://www.xmlspy.com) by Markus Doering (BGBM) -->
<!-- $Id:  $ -->
<!-- new TDWG protocol based on the DiGIR and BioCASE protocols -->
<xsd:schema targetNamespace="http://www.tdwg.org/schemas/protocol/2.0" xmlns="http://www.tdwg.org/schemas/protocol/2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="2.0">
	<!-- ============================================= -->
	<!-- SIMPLE TYPE DEFINITIONS-->
	<!-- ============================================= -->
	<xsd:simpleType name="allNNI">
		<xsd:annotation>
			<xsd:documentation>Taken from w3c schema for maxOccurs at: http://www.w3.org/2001/XMLSchema.xsd</xsd:documentation>
		</xsd:annotation>
		<xsd:union memberTypes="xsd:nonNegativeInteger">
			<xsd:simpleType>
				<xsd:restriction base="xsd:NMTOKEN">
					<xsd:enumeration value="unbounded"/>
				</xsd:restriction>
			</xsd:simpleType>
		</xsd:union>
	</xsd:simpleType>
	<xsd:simpleType name="integerNull">
		<xsd:annotation>
			<xsd:documentation>Any integer or the value "null"</xsd:documentation>
		</xsd:annotation>
		<xsd:union memberTypes="xsd:nonNegativeInteger">
			<xsd:simpleType>
				<xsd:restriction base="xsd:NMTOKEN">
					<xsd:enumeration value="null"/>
				</xsd:restriction>
			</xsd:simpleType>
		</xsd:union>
	</xsd:simpleType>
	<xsd:simpleType name="pathType">
		<xsd:annotation>
			<xsd:documentation>A simpleType to represent an xpath-type used for querying.</xsd:documentation>
		</xsd:annotation>
		<xsd:restriction base="xsd:string">
			<xsd:pattern value="(/[a-zA-Z0-9_\-]+)+(/@[a-zA-Z0-9_\-]+)?"/>
		</xsd:restriction>
	</xsd:simpleType>
	<xsd:simpleType name="pathQualifiedType">
		<xsd:annotation>
			<xsd:documentation>A simpleType to represent an xpath-type used for querying.</xsd:documentation>
		</xsd:annotation>
		<xsd:restriction base="xsd:string">
			<xsd:pattern value="([a-zA-Z0-9_\-]+:)?(/[a-zA-Z0-9_\-]+)+(/@[a-zA-Z0-9_\-]+)?"/>
		</xsd:restriction>
	</xsd:simpleType>
	<!-- ============================================= -->
	<!-- GENERAL COMPLEX TYPE DEFINITIONS-->
	<!-- ============================================= -->
	<xsd:complexType name="conceptType">
		<xsd:annotation>
			<xsd:documentation>Concept binding based on xpath for a single concept within a known schema.</xsd:documentation>
		</xsd:annotation>
		<xsd:attribute name="path" type="pathType" use="required"/>
	</xsd:complexType>
	<xsd:complexType name="qualifiedConceptType">
		<xsd:annotation>
			<xsd:documentation>Concept binding based on xpath for a single concept for any schema.</xsd:documentation>
		</xsd:annotation>
		<xsd:attribute name="path" type="pathQualifiedType" use="required"/>
	</xsd:complexType>
	<!--  ============================================= -->
	<!--REQUEST DEFINITION-->
	<!--  ============================================= -->
	<xsd:element name="request">
		<xsd:annotation>
			<xsd:documentation>Request message format.  Must always contain and header and may or maynot contain a payload, based on the type of request being made.</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="header" type="header"/>
				<xsd:element name="message" minOccurs="0">
					<xsd:annotation>
						<xsd:documentation>Used to specify parameters for a search or inventory only.</xsd:documentation>
					</xsd:annotation>
					<xsd:complexType>
						<xsd:sequence>
							<xsd:element name="recordDefinition" minOccurs="0" maxOccurs="unbounded">
								<xsd:annotation>
									<xsd:documentation>Define a list of concepts to be treated as the base of a record in a search response.</xsd:documentation>
								</xsd:annotation>
								<xsd:complexType>
									<xsd:attribute name="path" type="pathType" use="required"/>
								</xsd:complexType>
							</xsd:element>
							<xsd:element name="concepts">
								<xsd:annotation>
									<xsd:documentation>Used to specify the concepts to make an inventory on or to be used to specify the requested concepts for a search response. If for a search the list is empty, only the mandatory concepts will be returned. In case the path is pointing to a branch node, all its child nodes will be listed implicitly.</xsd:documentation>
								</xsd:annotation>
								<xsd:complexType>
									<xsd:sequence>
										<xsd:element name="concept" type="conceptType" minOccurs="0" maxOccurs="unbounded">
											<xsd:annotation>
												<xsd:documentation>A single qualified concept</xsd:documentation>
											</xsd:annotation>
										</xsd:element>
									</xsd:sequence>
								</xsd:complexType>
							</xsd:element>
							<xsd:element name="filter" type="filterType" minOccurs="0"/>
						</xsd:sequence>
						<xsd:attribute name="count" type="xsd:boolean" use="optional"/>
					</xsd:complexType>
				</xsd:element>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	<xsd:complexType name="header">
		<xsd:annotation>
			<xsd:documentation>Inline request header used in request and response documents.</xsd:documentation>
		</xsd:annotation>
		<xsd:sequence>
			<xsd:element name="source" maxOccurs="unbounded">
				<xsd:annotation>
					<xsd:documentation>The source of the request or response.  Repeatable to trace back all servers of the cascading request or involved providers/datasources. For search requests, it starts with the original requestor, the client.  For all other requests and for responses, its the accessPoint of the host machine. Holds the IP of the source with the timestamp as an attribute in ISO format. The attribute software should indicate the software incl its version used to generate or modify the document.</xsd:documentation>
				</xsd:annotation>
				<xsd:complexType>
					<xsd:attribute name="ip" type="xsd:anyURI" use="required"/>
					<xsd:attribute name="sendtime" type="xsd:dateTime" use="required"/>
					<xsd:attribute name="software" type="xsd:string" use="required"/>
					<xsd:attribute name="datasource" type="xsd:string" use="optional"/>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="destination" minOccurs="0" maxOccurs="unbounded">
				<xsd:annotation>
					<xsd:documentation>The destination access point of the request or response.  This will be the potentially multiple provider accesspoint(s) for requests to a portal or a single access point for provider/datasource destinations. For a response this is always the client address.</xsd:documentation>
				</xsd:annotation>
				<xsd:complexType>
					<xsd:sequence minOccurs="0">
						<xsd:element name="datasource" minOccurs="0" maxOccurs="unbounded">
							<xsd:annotation>
								<xsd:documentation>A list of addressed datasources in case the destination is a provider access point. Optional because in the case of a datasource being the destination directly, a datasource does not need to be specified.</xsd:documentation>
							</xsd:annotation>
							<xsd:complexType>
								<xsd:attribute name="name" type="xsd:string" use="required"/>
							</xsd:complexType>
						</xsd:element>
					</xsd:sequence>
					<xsd:attribute name="accesspoint" type="xsd:anyURI" use="required"/>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="type" minOccurs="0">
				<xsd:annotation>
					<xsd:documentation>Information about the used content compression method. This will allow to compress the "content" part of a response but leave the protocol envelope readable. software without decompression routines can still pass the data on and read its desitnation and source.</xsd:documentation>
				</xsd:annotation>
				<xsd:simpleType>
					<xsd:restriction base="xsd:string">
						<xsd:enumeration value="ping"/>
						<xsd:enumeration value="capabilities"/>
						<xsd:enumeration value="metadata"/>
						<xsd:enumeration value="inventory"/>
						<xsd:enumeration value="search"/>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:element>
			<xsd:element name="authentication" minOccurs="0">
				<xsd:annotation>
					<xsd:documentation>For passing optional authentication parameters. Eg an id after an authentication has been reached.</xsd:documentation>
				</xsd:annotation>
				<xsd:complexType>
					<xsd:attribute name="id" type="xsd:token" use="required"/>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
	</xsd:complexType>
	<xsd:element name="customSearch" type="responseStructureType">
		<xsd:annotation>
			<xsd:documentation>Define your own structur how the data should be returned refering to known concepts of another schema.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:complexType name="responseStructureType">
		<xsd:sequence>
			<xsd:element name="recordDefinition" type="pathType" minOccurs="0" maxOccurs="unbounded">
				<xsd:annotation>
					<xsd:documentation>Define a list of concepts to be treated as the base of a record. Use this concept if its repeatable or the closest repeatable parental element.</xsd:documentation>
				</xsd:annotation>
			</xsd:element>
			<xsd:element name="structure">
				<xsd:annotation>
					<xsd:documentation>Define a custom structure for the returned content starting with a root element.</xsd:documentation>
				</xsd:annotation>
				<xsd:complexType>
					<xsd:choice>
						<xsd:element name="element" type="elementType"/>
						<xsd:element name="externalStructureDefinition">
							<xsd:complexType>
								<xsd:attribute name="url" type="xsd:anyURI" use="required"/>
							</xsd:complexType>
						</xsd:element>
					</xsd:choice>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
	</xsd:complexType>
	<xsd:complexType name="elementType">
		<xsd:complexContent>
			<xsd:extension base="attributeType">
				<xsd:sequence>
					<xsd:element name="attributes" minOccurs="0">
						<xsd:complexType>
							<xsd:sequence>
								<xsd:element name="attribute" type="attributeType" maxOccurs="unbounded"/>
							</xsd:sequence>
						</xsd:complexType>
					</xsd:element>
					<xsd:element name="children" minOccurs="0">
						<xsd:complexType>
							<xsd:sequence>
								<xsd:element name="element" type="elementType" maxOccurs="unbounded"/>
							</xsd:sequence>
						</xsd:complexType>
					</xsd:element>
				</xsd:sequence>
				<xsd:attribute name="max" type="allNNI" use="required"/>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>
	<xsd:complexType name="attributeType">
		<xsd:complexContent>
			<xsd:extension base="conceptType">
				<xsd:attribute name="name" type="xsd:string" use="required"/>
				<xsd:attribute name="datatype" use="optional" default="string">
					<xsd:simpleType>
						<xsd:restriction base="xsd:string">
							<xsd:enumeration value="string"/>
							<xsd:enumeration value="boolean"/>
							<xsd:enumeration value="float"/>
							<xsd:enumeration value="double"/>
							<xsd:enumeration value="decimal"/>
							<xsd:enumeration value="dateTime"/>
							<xsd:enumeration value="duration"/>
							<xsd:enumeration value="hexBinary"/>
							<xsd:enumeration value="base64Binary"/>
							<xsd:enumeration value="anyURI"/>
							<xsd:enumeration value="ID"/>
							<xsd:enumeration value="IDREF"/>
							<xsd:enumeration value="ENTITY"/>
							<xsd:enumeration value="NOTATION"/>
							<xsd:enumeration value="normalizedString"/>
							<xsd:enumeration value="token"/>
							<xsd:enumeration value="language"/>
							<xsd:enumeration value="IDREFS"/>
							<xsd:enumeration value="ENTITIES"/>
							<xsd:enumeration value="NMTOKEN"/>
							<xsd:enumeration value="NMTOKENS"/>
							<xsd:enumeration value="Name"/>
							<xsd:enumeration value="QName"/>
							<xsd:enumeration value="NCName"/>
							<xsd:enumeration value="integer"/>
							<xsd:enumeration value="nonNegativeInteger"/>
							<xsd:enumeration value="positiveInteger"/>
							<xsd:enumeration value="nonPositiveInteger"/>
							<xsd:enumeration value="negativeInteger"/>
							<xsd:enumeration value="byte"/>
							<xsd:enumeration value="int"/>
							<xsd:enumeration value="long"/>
							<xsd:enumeration value="short"/>
							<xsd:enumeration value="unsignedByte"/>
							<xsd:enumeration value="unsignedInt"/>
							<xsd:enumeration value="unsignedLong"/>
							<xsd:enumeration value="unsignedShort"/>
							<xsd:enumeration value="date"/>
							<xsd:enumeration value="time"/>
							<xsd:enumeration value="gYearMonth"/>
							<xsd:enumeration value="gYear"/>
							<xsd:enumeration value="gMonthDay"/>
							<xsd:enumeration value="gDay"/>
							<xsd:enumeration value="gMonth"/>
						</xsd:restriction>
					</xsd:simpleType>
				</xsd:attribute>
				<xsd:attribute name="min" type="xsd:nonNegativeInteger" use="optional" default="0"/>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>
	<!-- ============================================= -->
	<!-- FILTER  DEFINITIONS-->
	<!-- ============================================= -->
	<xsd:complexType name="filterType">
		<xsd:choice>
			<xsd:element ref="COP"/>
			<xsd:element ref="LOP"/>
		</xsd:choice>
	</xsd:complexType>
	<!-- ===== EXPRESSIONS ===== -->
	<xsd:element name="expression" abstract="true">
		<xsd:annotation>
			<xsd:documentation>A base to group all COPs or literal values. Could be used in the future to implement arithmetics or even more sophisitcated expressions like the ones used in the openGIS filter specification.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="literal" substitutionGroup="expression">
		<xsd:annotation>
			<xsd:documentation>An element to represent literals / values. Substitutes an abstract expression element.</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:attribute name="value" type="xsd:string" use="required"/>
		</xsd:complexType>
	</xsd:element>
	<xsd:element name="concept" type="qualifiedConceptType" abstract="true" substitutionGroup="expression">
		<xsd:annotation>
			<xsd:documentation>An element to represent a concept of one specific conceptual schema. Substitutes an abstract expression element.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<!-- ===== COMPARATIVE OPERATORS ===== -->
	<xsd:element name="COP" abstract="true">
		<xsd:annotation>
			<xsd:documentation>An abstract element provided as a base to group all comparitive operator elements.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<!-- === unary === -->
	<xsd:element name="unaryCOP" abstract="true" substitutionGroup="COP"/>
	<xsd:complexType name="unaryCOPType">
		<xsd:complexContent>
			<xsd:extension base="qualifiedConceptType"/>
		</xsd:complexContent>
	</xsd:complexType>
	<xsd:element name="isNull" type="unaryCOPType" substitutionGroup="unaryCOP">
		<xsd:annotation>
			<xsd:documentation>Compares if concept is null. use equal element to compare for empty strings ''.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<!-- === binary === -->
	<xsd:element name="binaryCOP" abstract="true" substitutionGroup="COP"/>
	<xsd:complexType name="binaryCOPType">
		<xsd:sequence>
			<xsd:element ref="expression"/>
			<xsd:element ref="expression"/>
		</xsd:sequence>
	</xsd:complexType>
	<xsd:element name="equals" type="binaryCOPType" substitutionGroup="binaryCOP">
		<xsd:annotation>
			<xsd:documentation>The equals (=) comparator element.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="lessThan" type="binaryCOPType" substitutionGroup="binaryCOP">
		<xsd:annotation>
			<xsd:documentation>The less than (&lt;) comparator element.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="lessThanOrEquals" type="binaryCOPType" substitutionGroup="binaryCOP">
		<xsd:annotation>
			<xsd:documentation>The less than or equals (&lt;=) comparator element.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="greaterThan" type="binaryCOPType" substitutionGroup="binaryCOP">
		<xsd:annotation>
			<xsd:documentation>The greater than (&gt;) comparator element.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="greaterThanOrEquals" type="binaryCOPType" substitutionGroup="binaryCOP">
		<xsd:annotation>
			<xsd:documentation>The greater than or equals (&gt;=) comparator element.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<xsd:element name="like" type="binaryCOPType" substitutionGroup="binaryCOP">
		<xsd:annotation>
			<xsd:documentation>The like (LIKE) comparator element.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<!-- === multiple === -->
	<xsd:element name="multiCOP" abstract="true" substitutionGroup="COP"/>
	<xsd:complexType name="multiCOPType">
		<xsd:complexContent>
			<xsd:extension base="qualifiedConceptType">
				<xsd:sequence>
					<xsd:element ref="literal" maxOccurs="unbounded"/>
				</xsd:sequence>
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>
	<xsd:element name="in" type="multiCOPType" substitutionGroup="multiCOP">
		<xsd:annotation>
			<xsd:documentation>The in (IN) comparator element.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<!-- ===== LOGICAL OPERATORS ===== -->
	<xsd:element name="LOP" abstract="true">
		<xsd:annotation>
			<xsd:documentation>A logical operator clause.  This is an abstract element to be substituted by concrete logical operator elements.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<!-- === unary === -->
	<xsd:element name="unaryLOP" abstract="true" substitutionGroup="LOP"/>
	<xsd:complexType name="unaryLOPType">
		<xsd:choice>
			<xsd:element ref="COP"/>
			<xsd:element ref="LOP"/>
		</xsd:choice>
	</xsd:complexType>
	<xsd:element name="not" substitutionGroup="unaryLOP">
		<xsd:complexType>
			<xsd:complexContent>
				<xsd:extension base="unaryLOPType"/>
			</xsd:complexContent>
		</xsd:complexType>
	</xsd:element>
	<!-- === multiple === -->
	<xsd:element name="multiLOP" abstract="true" substitutionGroup="LOP"/>
	<xsd:complexType name="multiLOPType">
		<xsd:choice minOccurs="2" maxOccurs="unbounded">
			<xsd:element ref="COP"/>
			<xsd:element ref="LOP"/>
		</xsd:choice>
	</xsd:complexType>
	<xsd:element name="and" type="multiLOPType" substitutionGroup="multiLOP"/>
	<xsd:element name="or" type="multiLOPType" substitutionGroup="multiLOP">
		<xsd:annotation>
			<xsd:documentation>The or logical operator.</xsd:documentation>
		</xsd:annotation>
	</xsd:element>
	<!-- ============================================= -->
	<!--RESPONSE TYPE DEFINITIONS-->
	<!-- ============================================= -->
	<xsd:element name="responses">
		<xsd:annotation>
			<xsd:documentation>Responses are used by providers or portals to wrap several responses into one.</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="response" maxOccurs="unbounded"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	<xsd:element name="response">
		<xsd:annotation>
			<xsd:documentation>Response message format for a single datasource. Not to be used by a provider.</xsd:documentation>
		</xsd:annotation>
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="header" type="header"/>
				<xsd:element name="content" minOccurs="0">
					<xsd:annotation>
						<xsd:documentation>The content of a response, regardless of the request type.</xsd:documentation>
					</xsd:annotation>
					<xsd:complexType>
						<xsd:choice>
							<xsd:group ref="capabilitiesResponseGroup"/>
							<xsd:group ref="pingResponseGroup"/>
							<xsd:group ref="metadataResponseGroup"/>
							<xsd:group ref="inventoryResponseGroup"/>
							<xsd:group ref="searchResponseGroup"/>
						</xsd:choice>
					</xsd:complexType>
				</xsd:element>
				<xsd:element name="diagnostics">
					<xsd:annotation>
						<xsd:documentation>The diagnostics element can contain many diagnostic pieces of information.  Should the possible diagnostic codes/messages be defined more granularly in a seperate XML Schema?</xsd:documentation>
					</xsd:annotation>
					<xsd:complexType>
						<xsd:sequence>
							<xsd:element name="diagnostic" type="diagnostic" maxOccurs="unbounded"/>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
				<xsd:element name="footer">
					<xsd:annotation>
						<xsd:documentation>The footer holds information about the number of records for paging purposes.</xsd:documentation>
					</xsd:annotation>
					<xsd:complexType>
						<xsd:attribute name="start" type="xsd:integer" use="required"/>
						<xsd:attribute name="next" type="integerNull" use="required"/>
						<xsd:attribute name="totalReturned" type="xsd:integer" use="required"/>
						<xsd:attribute name="totalMatched" type="xsd:integer" use="optional"/>
					</xsd:complexType>
				</xsd:element>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	<xsd:complexType name="diagnostic">
		<xsd:simpleContent>
			<xsd:extension base="xsd:string">
				<xsd:attribute name="code" type="xsd:string"/>
				<xsd:attribute name="severity" default="info">
					<xsd:simpleType>
						<xsd:restriction base="xsd:string">
							<xsd:enumeration value="debug"/>
							<xsd:enumeration value="info"/>
							<xsd:enumeration value="warn"/>
							<xsd:enumeration value="error"/>
							<xsd:enumeration value="fatal"/>
						</xsd:restriction>
					</xsd:simpleType>
				</xsd:attribute>
			</xsd:extension>
		</xsd:simpleContent>
	</xsd:complexType>
	<!-- ===== PING ===== -->
	<xsd:group name="pingResponseGroup">
		<xsd:sequence>
			<xsd:element name="pong" type="pingResponseType"/>
		</xsd:sequence>
	</xsd:group>
	<xsd:complexType name="pingResponseType"/>
	<!-- ===== CAPABILITIES ===== -->
	<xsd:complexType name="capabilitiesResponseType">
		<xsd:group ref="capabilitiesResponseGroup"/>
	</xsd:complexType>
	<xsd:group name="capabilitiesResponseGroup">
		<xsd:choice>
			<xsd:group ref="capabilitiesProviderResponseGroup"/>
			<xsd:group ref="capabilitiesDatasourceResponseGroup"/>
		</xsd:choice>
	</xsd:group>
	<xsd:complexType name="filterOperatorsType">
		<xsd:sequence>
			<xsd:element name="logicalOperators" minOccurs="0">
				<xsd:annotation>
					<xsd:documentation>This includes all 3 operators. AND, OR, NOT</xsd:documentation>
				</xsd:annotation>
				<xsd:complexType/>
			</xsd:element>
			<xsd:element name="comparativeOperators">
				<xsd:complexType>
					<xsd:sequence>
						<xsd:element name="basicComparativeOperators" minOccurs="0">
							<xsd:annotation>
								<xsd:documentation>This includes the basic comparative operators =, &lt;, &gt;, &lt;=, &gt;=</xsd:documentation>
							</xsd:annotation>
						</xsd:element>
						<xsd:element name="in" minOccurs="0"/>
						<xsd:element name="isNull" minOccurs="0"/>
						<xsd:element name="like" minOccurs="0"/>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="spatialOperators" minOccurs="0">
				<xsd:complexType>
					<xsd:sequence minOccurs="0">
						<xsd:any minOccurs="0" maxOccurs="unbounded"/>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="functions" minOccurs="0">
				<xsd:complexType>
					<xsd:sequence minOccurs="0">
						<xsd:element name="min" minOccurs="0">
							<xsd:complexType>
								<xsd:attribute name="nargs" type="allNNI" use="required"/>
							</xsd:complexType>
						</xsd:element>
						<xsd:element name="max" minOccurs="0">
							<xsd:complexType>
								<xsd:attribute name="nargs" type="allNNI" use="required"/>
							</xsd:complexType>
						</xsd:element>
						<xsd:element name="function" minOccurs="0" maxOccurs="unbounded">
							<xsd:complexType>
								<xsd:attribute name="name" type="xsd:string" use="required"/>
								<xsd:attribute name="nargs" type="xsd:int" use="required"/>
							</xsd:complexType>
						</xsd:element>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
	</xsd:complexType>
	<xsd:complexType name="requestTypesType">
		<xsd:sequence>
			<xsd:element name="ping" minOccurs="0">
				<xsd:complexType/>
			</xsd:element>
			<xsd:element name="capabilities" minOccurs="0">
				<xsd:complexType/>
			</xsd:element>
			<xsd:element name="metadata" minOccurs="0">
				<xsd:complexType/>
			</xsd:element>
			<xsd:element name="inventory" minOccurs="0">
				<xsd:complexType/>
			</xsd:element>
			<xsd:element name="search" minOccurs="0">
				<xsd:complexType/>
			</xsd:element>
			<xsd:element name="customSearch" minOccurs="0">
				<xsd:complexType/>
			</xsd:element>
		</xsd:sequence>
	</xsd:complexType>
	<!-- === provider === -->
	<xsd:group name="capabilitiesProviderResponseGroup">
		<xsd:sequence>
			<xsd:element name="provider">
				<xsd:complexType>
					<xsd:sequence>
						<xsd:element name="software" minOccurs="0" maxOccurs="unbounded">
							<xsd:annotation>
								<xsd:documentation>Version and name of the software involed in editing the protocol document. E.g provider software, portal, proxy, ...</xsd:documentation>
							</xsd:annotation>
							<xsd:complexType>
								<xsd:sequence minOccurs="0">
									<xsd:element name="component" minOccurs="0" maxOccurs="unbounded">
										<xsd:annotation>
											<xsd:documentation>Name and version of the software component being used by the software.</xsd:documentation>
										</xsd:annotation>
										<xsd:complexType>
											<xsd:attribute name="name" type="xsd:string" use="required"/>
											<xsd:attribute name="version" type="xsd:string" use="optional"/>
										</xsd:complexType>
									</xsd:element>
								</xsd:sequence>
								<xsd:attribute name="name" type="xsd:string" use="required"/>
								<xsd:attribute name="version" type="xsd:string" use="optional"/>
							</xsd:complexType>
						</xsd:element>
						<xsd:element name="requestTypes">
							<xsd:annotation>
								<xsd:documentation>Information about the supported request types of this service.</xsd:documentation>
							</xsd:annotation>
							<xsd:complexType>
								<xsd:complexContent>
									<xsd:extension base="requestTypesType">
										<xsd:attribute name="canHandleMultipleDatasources" type="xsd:boolean" use="required"/>
									</xsd:extension>
								</xsd:complexContent>
							</xsd:complexType>
						</xsd:element>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="datasources" minOccurs="0">
				<xsd:annotation>
					<xsd:documentation>what security related capabilities does the provider have? encryption, access restriction, etc.</xsd:documentation>
				</xsd:annotation>
				<xsd:complexType>
					<xsd:sequence>
						<xsd:element name="datasource" maxOccurs="unbounded">
							<xsd:complexType>
								<xsd:complexContent>
									<xsd:extension base="capabilitiesDatasourceResponseType">
										<xsd:attribute name="name"/>
									</xsd:extension>
								</xsd:complexContent>
							</xsd:complexType>
						</xsd:element>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
	</xsd:group>
	<xsd:complexType name="capabilitiesProviderResponseType">
		<xsd:group ref="capabilitiesProviderResponseGroup"/>
	</xsd:complexType>
	<!-- === datasource === -->
	<xsd:group name="capabilitiesDatasourceResponseGroup">
		<xsd:sequence>
			<xsd:element name="metadataSchema">
				<xsd:complexType>
					<xsd:attribute name="ns" type="xsd:anyURI" use="required"/>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="conceptualSchema" minOccurs="0" maxOccurs="unbounded">
				<xsd:annotation>
					<xsd:documentation>holds the namespace of a supported schema.</xsd:documentation>
				</xsd:annotation>
				<xsd:complexType>
					<xsd:sequence minOccurs="0">
						<xsd:element name="software">
							<xsd:annotation>
								<xsd:documentation>Version and name of the software involed in editing the protocol document. E.g provider software, portal, proxy, ...</xsd:documentation>
							</xsd:annotation>
							<xsd:complexType>
								<xsd:sequence minOccurs="0">
									<xsd:element name="component" minOccurs="0" maxOccurs="unbounded">
										<xsd:annotation>
											<xsd:documentation>Name and version of the software component being used by the software.</xsd:documentation>
										</xsd:annotation>
										<xsd:complexType>
											<xsd:attribute name="name" type="xsd:string" use="required"/>
											<xsd:attribute name="version" type="xsd:string" use="optional"/>
										</xsd:complexType>
									</xsd:element>
								</xsd:sequence>
								<xsd:attribute name="name" type="xsd:string" use="required"/>
								<xsd:attribute name="version" type="xsd:string" use="optional"/>
							</xsd:complexType>
						</xsd:element>
						<xsd:element name="settings">
							<xsd:annotation>
								<xsd:documentation>Information about the provider configuration for a datasource.</xsd:documentation>
							</xsd:annotation>
							<xsd:complexType>
								<xsd:sequence>
									<xsd:element name="minQueryTermLength" type="xsd:integer" minOccurs="0"/>
									<xsd:element name="maxSearchResponseRecords" type="xsd:integer" minOccurs="0"/>
									<xsd:element name="maxInventoryResponseRecords" type="xsd:integer" minOccurs="0"/>
									<xsd:any minOccurs="0">
										<xsd:annotation>
											<xsd:documentation>Allow for more application specific settings.</xsd:documentation>
										</xsd:annotation>
									</xsd:any>
								</xsd:sequence>
							</xsd:complexType>
						</xsd:element>
						<xsd:element name="mappedConcepts">
							<xsd:complexType>
								<xsd:sequence>
									<xsd:element name="concept" maxOccurs="unbounded">
										<xsd:annotation>
											<xsd:documentation>Each mapped/configured concept of a schema of this resource is listed here as a single concept returning a boolean flag if it is searchable.</xsd:documentation>
										</xsd:annotation>
										<xsd:complexType>
											<xsd:complexContent>
												<xsd:extension base="conceptType">
													<xsd:attribute name="searchable" type="xsd:boolean" use="required"/>
												</xsd:extension>
											</xsd:complexContent>
										</xsd:complexType>
									</xsd:element>
								</xsd:sequence>
							</xsd:complexType>
						</xsd:element>
						<xsd:element name="filterOperators" type="filterOperatorsType">
							<xsd:annotation>
								<xsd:documentation>Information about the supported filter operators of this service.</xsd:documentation>
							</xsd:annotation>
						</xsd:element>
						<xsd:element name="requestTypes" type="requestTypesType">
							<xsd:annotation>
								<xsd:documentation>Information about the supported request types of this service.</xsd:documentation>
							</xsd:annotation>
						</xsd:element>
						<xsd:element name="security" type="xsd:anyType" minOccurs="0">
							<xsd:annotation>
								<xsd:documentation>what security related capabilities does the provider have? encryption, access restriction, etc.</xsd:documentation>
							</xsd:annotation>
						</xsd:element>
						<xsd:any>
							<xsd:annotation>
								<xsd:documentation>Slot for future custom needs ...</xsd:documentation>
							</xsd:annotation>
						</xsd:any>
					</xsd:sequence>
					<xsd:attribute name="ns" type="xsd:anyURI" use="required"/>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
	</xsd:group>
	<xsd:complexType name="capabilitiesDatasourceResponseType">
		<xsd:group ref="capabilitiesDatasourceResponseGroup"/>
	</xsd:complexType>
	<!-- ===== METADATA ===== -->
	<xsd:group name="metadataResponseGroup">
		<xsd:annotation>
			<xsd:documentation>Simple generic build-in metadata response</xsd:documentation>
		</xsd:annotation>
		<xsd:sequence>
			<xsd:element name="provider" type="metadataCoreType"/>
			<xsd:element name="datasources" minOccurs="0">
				<xsd:complexType>
					<xsd:sequence>
						<xsd:element name="datasource" maxOccurs="unbounded">
							<xsd:complexType>
								<xsd:complexContent>
									<xsd:extension base="metadataCoreType">
										<xsd:sequence>
											<xsd:element name="keywords" type="xsd:string" minOccurs="0"/>
											<xsd:element name="conceptualSchema" minOccurs="0" maxOccurs="unbounded">
												<xsd:annotation>
													<xsd:documentation>holds the namespace of a supported schema.</xsd:documentation>
												</xsd:annotation>
												<xsd:complexType>
													<xsd:attribute name="ns" type="xsd:anyURI" use="required"/>
													<xsd:attribute name="dateLastUpdated" type="xsd:date" use="optional"/>
													<xsd:attribute name="numberOfRecords" type="xsd:int" use="optional"/>
												</xsd:complexType>
											</xsd:element>
										</xsd:sequence>
									</xsd:extension>
								</xsd:complexContent>
							</xsd:complexType>
						</xsd:element>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
	</xsd:group>
	<xsd:complexType name="metadataResponseType">
		<xsd:annotation>
			<xsd:documentation>Simple generic build-in metadata response</xsd:documentation>
		</xsd:annotation>
		<xsd:group ref="metadataResponseGroup"/>
	</xsd:complexType>
	<xsd:complexType name="metadataCoreType" mixed="true">
		<xsd:sequence minOccurs="0">
			<xsd:element name="accessPoint">
				<xsd:complexType>
					<xsd:attribute name="url" type="xsd:anyURI" use="required"/>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="name">
				<xsd:complexType>
					<xsd:simpleContent>
						<xsd:extension base="xsd:string">
							<xsd:attribute name="acronym" type="xsd:string" use="optional"/>
							<xsd:attribute name="citation" type="xsd:string" use="optional"/>
						</xsd:extension>
					</xsd:simpleContent>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="logo" minOccurs="0">
				<xsd:complexType>
					<xsd:attribute name="url" type="xsd:anyURI" use="required"/>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="contact">
				<xsd:complexType>
					<xsd:complexContent>
						<xsd:extension base="contactType">
							<xsd:attribute name="type" use="required">
								<xsd:simpleType>
									<xsd:restriction base="xsd:string">
										<xsd:enumeration value="technical"/>
										<xsd:enumeration value="administrative"/>
										<xsd:enumeration value="other"/>
									</xsd:restriction>
								</xsd:simpleType>
							</xsd:attribute>
						</xsd:extension>
					</xsd:complexContent>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="abstract" type="xsd:string"/>
			<xsd:element name="relatedInformation" minOccurs="0" maxOccurs="unbounded">
				<xsd:complexType>
					<xsd:attribute name="url" type="xsd:anyURI" use="required"/>
					<xsd:attribute name="name" type="xsd:string" use="optional"/>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
	</xsd:complexType>
	<xsd:complexType name="contactType" mixed="true">
		<xsd:sequence>
			<xsd:element name="name" type="xsd:string"/>
			<xsd:element name="email" type="xsd:string" minOccurs="0"/>
			<xsd:element name="phone" type="xsd:string" minOccurs="0"/>
			<xsd:element name="title" type="xsd:string" minOccurs="0"/>
		</xsd:sequence>
	</xsd:complexType>
	<!-- ===== INVENTORY===== -->
	<xsd:group name="inventoryResponseGroup">
		<xsd:sequence>
			<xsd:element name="metadata" minOccurs="0">
				<xsd:complexType>
					<xsd:sequence>
						<xsd:any maxOccurs="unbounded"/>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="concepts">
				<xsd:annotation>
					<xsd:documentation>Envelope to list all concepts that have been used for the inventory response.</xsd:documentation>
				</xsd:annotation>
				<xsd:complexType>
					<xsd:sequence>
						<xsd:element name="concept" type="qualifiedConceptType" maxOccurs="unbounded">
							<xsd:annotation>
								<xsd:documentation>Header row giving the concept for each value of the sequence within a record below.</xsd:documentation>
							</xsd:annotation>
						</xsd:element>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
			<xsd:element name="record" minOccurs="0" maxOccurs="unbounded">
				<xsd:annotation>
					<xsd:documentation>A distinct combination of values for all "inventoried" concepts. The optional attribute "count" is used to count the number of occurences for this distinct combination and will only be  set if the count flag was used when requesting an inventory.</xsd:documentation>
				</xsd:annotation>
				<xsd:complexType>
					<xsd:sequence>
						<xsd:element name="value" maxOccurs="unbounded">
							<xsd:annotation>
								<xsd:documentation>A single value for a single concept. The sequence of the values should correspond to the one given in the concept header row above.</xsd:documentation>
							</xsd:annotation>
							<xsd:complexType>
								<xsd:simpleContent>
									<xsd:extension base="xsd:string"/>
								</xsd:simpleContent>
							</xsd:complexType>
						</xsd:element>
					</xsd:sequence>
					<xsd:attribute name="count" type="xsd:positiveInteger" use="optional"/>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
	</xsd:group>
	<xsd:complexType name="inventoryResponseType">
		<xsd:group ref="inventoryResponseGroup"/>
	</xsd:complexType>
	<!-- ===== SEARCH ===== -->
	<xsd:group name="searchResponseGroup">
		<xsd:sequence>
			<xsd:element name="recordSet" minOccurs="0" maxOccurs="unbounded">
				<xsd:complexType>
					<xsd:sequence>
						<xsd:element name="metadata" minOccurs="0">
							<xsd:complexType>
								<xsd:sequence>
									<xsd:any maxOccurs="unbounded"/>
								</xsd:sequence>
							</xsd:complexType>
						</xsd:element>
						<xsd:element name="record" minOccurs="0" maxOccurs="unbounded">
							<xsd:annotation>
								<xsd:documentation>Records of a search response.</xsd:documentation>
							</xsd:annotation>
							<xsd:complexType>
								<xsd:sequence>
									<xsd:any maxOccurs="unbounded"/>
								</xsd:sequence>
							</xsd:complexType>
						</xsd:element>
					</xsd:sequence>
				</xsd:complexType>
			</xsd:element>
		</xsd:sequence>
	</xsd:group>
	<xsd:complexType name="searchResponseType">
		<xsd:group ref="searchResponseGroup"/>
	</xsd:complexType>
</xsd:schema>
