<?xml version="1.0"?>
<!-- schema of XRPC SOAP messages -->
<xs:schema version="0.1" xml:lang="EN"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://monetdb.cwi.nl/XQuery"
    xmlns:xrpc="http://monetdb.cwi.nl/XQuery"
    elementFormDefault="qualified">

<!-- definition of simple elements -->
  <xs:element name="atomic-value" type="xs:anySimpleType"/>
  <xs:element name="attribute"/>
  <xs:element name="comment"/>
  <xs:element name="document"/>
  <xs:element name="element"/>
  <xs:element name="processing-instruction"/>
  <xs:element name="text"/>
  <xs:element name="udf-element"  type="xrpc:udfElemType"/>

<!-- definition of complex elements -->
  <xs:element name="request"    type="xrpc:requestType"/>
  <xs:element name="call"       type="xrpc:callType"/>
  <xs:element name="response"   type="xrpc:responseType"/>
  <xs:element name="sequence"   type="xrpc:sequenceType"/>
  <xs:element name="queryID"    type="xrpc:qidType"/>

<!-- definition of attributes -->
<!-- timestamp: micro-seconds; timeout: mini-seconds -->
  <xs:attribute name="timestamp"  type="xs:dateTime"/>
  <xs:attribute name="host"       type="xs:anyURI"/>
  <xs:attribute name="timeout"    type="xs:double"/>
  <xs:attribute name="module"     type="xs:string"/>
  <xs:attribute name="method"     type="xs:string"/>
  <xs:attribute name="location"   type="xs:anyURI"/>
  <xs:attribute name="arity"      type="xs:integer"/>
  <xs:attribute name="iter-count" type="xs:integer"/>
  <xs:attribute name="updCall"    type="xs:string"/>
  <xs:attribute name="tag"        type="xs:string"/>
  <xs:attribute name="caller"     type="xs:string"/>

<!-- definition of complex types -->
  <xs:complexType name="qidType">
    <xs:attribute ref="xrpc:timestamp" use="required"/>
    <xs:attribute ref="xrpc:host"      use="required"/>
    <xs:attribute ref="xrpc:timeout"   use="required"/>
  </xs:complexType>

  <xs:complexType name="udfElemType">
    <xs:sequence>
      <xs:any minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="sequenceType">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:choice>
        <xs:element ref="xrpc:atomic-value"/>
        <xs:element ref="xrpc:attribute"/>
        <xs:element ref="xrpc:comment"/>
        <xs:element ref="xrpc:document"/>
        <xs:element ref="xrpc:element"/>
        <xs:element ref="xrpc:processing-instruction"/>
        <xs:element ref="xrpc:text"/>
        <xs:element ref="xrpc:udf-element"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="callType">
    <xs:sequence>
      <xs:element ref="xrpc:sequence" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="xrpc:tag"/>
  </xs:complexType>

  <xs:complexType name="requestType">
    <xs:sequence>
      <xs:element ref="xrpc:queryID" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="xrpc:call" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="xrpc:module"     use="required"/>
    <xs:attribute ref="xrpc:method"     use="required"/>
    <xs:attribute ref="xrpc:location"   use="required"/>
    <xs:attribute ref="xrpc:arity"      use="required"/>
    <xs:attribute ref="xrpc:iter-count"/>
    <xs:attribute ref="xrpc:updCall"    use="required"/>
    <xs:attribute ref="xrpc:caller"/>
  </xs:complexType>

  <xs:complexType name="responseType">
    <xs:sequence>
      <xs:element ref="xrpc:queryID" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="xrpc:sequence" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="xrpc:module" use="required"/>
    <xs:attribute ref="xrpc:method" use="required"/>
  </xs:complexType>
</xs:schema>
