<?xml version="1.0"?>
<xs:schema xmlns="http://www.ruleml.org/0.91/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ruleml.org/0.91/xsd" elementFormDefault="qualified">
	<xs:annotation>
		<xs:documentation xml:lang="en">
          
			Message module part of Reaction RuleML.

			This is the XML Schema Message module for Reaction RuleML.
			File: message_module.xsd
			Version: 0.2
			Last Modification: 2007-07-20

			This schema declares the following Reaction RuleML elements and attributes:		  

			  * Message
			  * protocol
			  * sender
			  * receiver			 
			  * content
			  * @mode
			  * @directive
			
			The approach is modelled after that used in "Modularization of XHTML in XML Schema"
			WD [http://www.w3.org/TR/xhtml-m12n-schema/], which will soon be integrated with
			"Modularization of XHTML" (REC-xhtml-modularization-20010410)
			[http://www.w3.org/TR/xhtml-modularization/].
		</xs:documentation>
	</xs:annotation>
	
<!--
      *** Message ***
      A Message element that provides the syntax for inbound and outbound messages / notifications 

      content model: 
       ( label?, scope?, qualification?, (oid | Ind | Var | Expr), (protocol | Ind | Var | Expr), (sender | receiver | Ind | Var | Expr), (content | Atom | Ind | Var | Expr | Plex | Naf | Neg | Rulebase | And | Or | Entails | Exists | Equal) )
      
      Message has the following attributes:
      @mode, @directive
      
-->
	<xs:attributeGroup name="Message.attlist">
		<xs:attributeGroup ref="message-mode.attrib"/>		
		<xs:attributeGroup ref="message-directive.attrib"/>		
	</xs:attributeGroup>
	<xs:group name="Message.content">
		<xs:sequence>
			<xs:group ref="labels.content"/>
			<xs:choice>
				<xs:element ref="oid"/>
				<xs:element ref="Ind"/>
				<xs:element ref="Var"/>
				<xs:element ref="Expr"/>
			</xs:choice>	
			
			<xs:choice>
				<xs:element ref="protocol"/>
				<xs:element ref="Ind"/>
				<xs:element ref="Var"/>
				<xs:element ref="Expr"/>
			</xs:choice>	
			
			<xs:choice>
				<xs:element ref="sender"/>
				<xs:element ref="receiver"/>
				<xs:element ref="Ind"/>
				<xs:element ref="Var"/>
				<xs:element ref="Expr"/>
			</xs:choice>	
						
			
			<xs:choice>
				<xs:element ref="content"/>
				<xs:group ref="formula-query.content"/>
				<xs:element ref="Ind"/>
				<xs:element ref="Var"/>
				<xs:element ref="Expr"/>			
				<xs:element ref="Plex"/>
			</xs:choice>	
			
		</xs:sequence>
	</xs:group>
	<xs:complexType name="Message.type">
		<xs:group ref="Message.content"/>
		<xs:attributeGroup ref="Message.attlist"/>
	</xs:complexType>
	<xs:element name="Message" type="Message.type"/>


<!--
     *** protocol ***
     
     content model: (Ind | Var | Expr )
-->
	<xs:attributeGroup name="protocol.attlist"/>
	<xs:group name="protocol.content">
		<xs:sequence>
			<xs:choice>
				<xs:element ref="Ind"/>
				<xs:element ref="Var"/>				
				<xs:element ref="Expr"/>
			</xs:choice>
		</xs:sequence>
	</xs:group>
	<xs:complexType name="protocol.type">
		<xs:group ref="protocol.content"/>
		<xs:attributeGroup ref="protocol.attlist"/>
	</xs:complexType>
	<xs:element name="protocol" type="protocol.type"/>





<!--
     *** sender ***
     *** receiver ***
     
     content model: (Ind | Var | Expr )
-->
	<xs:attributeGroup name="sender.attlist"/>
	<xs:group name="sender.content">
		<xs:sequence>
			<xs:choice>
				<xs:element ref="Ind"/>
				<xs:element ref="Var"/>				
				<xs:element ref="Expr"/>
			</xs:choice>
		</xs:sequence>
	</xs:group>
	<xs:complexType name="sender.type">
		<xs:group ref="sender.content"/>
		<xs:attributeGroup ref="sender.attlist"/>
	</xs:complexType>
	<xs:element name="sender" type="sender.type"/>
	<xs:element name="receiver" type="sender.type"/>


<!--
     *** content ***
     
     content model: (Atom | Ind | Var | Expr | Plex | Naf | Neg | Rulebase | And | Or | Entails | Exists | Equal)
-->
	<xs:attributeGroup name="content.attlist"/>
	<xs:group name="content.content">
		<xs:choice>
			<xs:group ref="formula-query.content"/>
			<xs:element ref="Ind"/>
			<xs:element ref="Var"/>
			<xs:element ref="Expr"/>			
			<xs:element ref="Plex"/>
		</xs:choice>	
	</xs:group>
	<xs:complexType name="content.type">
		<xs:group ref="content.content"/>
		<xs:attributeGroup ref="content.attlist"/>
	</xs:complexType>
	<xs:element name="content" type="content.type"/>

<!--
    *** @mode ***

     restriction: inbound | outbound ; 
	 default = inbound
	 optional attribute
-->

	<xs:attributeGroup name="message-mode.attrib">
		<xs:attribute name="mode" use="optional" default="inbound">
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="inbound"/>
					<xs:enumeration value="outbound"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
	</xs:attributeGroup>


<!--
    *** @directive ***

     restriction: different performatives / directives, e.g. ACL:inform 
	 required attribute
-->

	<xs:attributeGroup name="message-directive.attrib">
			<xs:attribute name="directive" type="xs:string" use="required"/>
	</xs:attributeGroup>
	
	

</xs:schema>
