SDRule-ML XSD
…
<!--SDRule-L-->
<xs:element name="SDRule">
<xs:complexType>
<xs:sequence>
<xs:element ref="Object" maxOccurs="unbounded"/>
<xs:element ref="Predicate" maxOccurs="unbounded"/>
<xs:element ref="Constraint" minOccurs="0" maxOccurs="unbounded"/>
<xs:choice maxOccurs="unbounded">
<xs:element ref="Rule"/>
<xs:element ref="Set"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="name" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Constraint">
<xs:complexType>
<xs:choice>
<xs:element ref="Value" maxOccurs="unbounded"/>
<xs:element ref="Object_Role" maxOccurs="unbounded"/>
</xs:choice>
<xs:attribute name="Object" type="xs:NCName"/>
<xs:attribute name="type" type="xs:NCName" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Object">
<xs:complexType mixed="true">
<xs:attribute name="Name" type="xs:NCName" use="optional"/>
<xs:attribute name="type" type="xs:NCName" use="optional"/>
<xs:attribute name="CI" type="xs:anyURI" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="Predicate">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element ref="Object_Role" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:NCName"/>
</xs:complexType>
</xs:element>
<xs:element name="Value" type="xs:NCName"/>
<xs:element name="Object_Role">
<xs:complexType mixed="true">
<xs:choice minOccurs="0">
<xs:element ref="Object"/>
</xs:choice>
<xs:attribute name="ID" type="xs:NCName"/>
<xs:attribute name="Object" type="xs:NCName"/>
<xs:attribute name="Role" type="xs:NCName"/>
</xs:complexType>
</xs:element>
<xs:element name="Rule">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="Atom" maxOccurs="unbounded"/>
<xs:element ref="head" minOccurs="0"/>
<xs:element ref="body" minOccurs="0"/>
</xs:choice>
<xs:attribute name="Maximum" type="xs:NCName"/>
<xs:attribute name="Minimum" type="xs:integer"/>
<xs:attribute name="direction" type="xs:NCName"/>
<xs:attribute name="id" type="xs:NCName"/>
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="body">
<xs:complexType>
<xs:choice>
<xs:element ref="Union"/>
<xs:element ref="And"/>
<xs:element ref="Equivalent"/>
<xs:element ref="Neg"/>
<xs:element ref="Or"/>
<xs:element ref="Atom"/>
<xs:element ref="Rule"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="Or">
<xs:complexType>
<xs:sequence>
<xs:element ref="Atom" minOccurs="2" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="And">
<xs:complexType>
<xs:sequence>
<xs:element ref="Atom" minOccurs="2" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Equivalent">
<xs:complexType>
<xs:sequence>
<xs:element ref="Atom" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Neg">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element ref="Atom"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="head">
<xs:complexType>
<xs:choice>
<xs:element ref="Atom"/>
<xs:element ref="And"/>
<xs:element ref="Or"/>
<xs:element ref="Neg"/>
<xs:element ref="Rule"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="Set">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element ref="Predicate" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="xs:NCName"/>
<xs:attribute name="name"/>
</xs:complexType>
</xs:element>
<xs:element name="Atom">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="Object" minOccurs="0"/>
<xs:element ref="Predicate" minOccurs="0"/>
<xs:element ref="Rule"/>
<xs:element ref="Set" minOccurs="0"/>
<xs:element ref="Value" minOccurs="0"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="Union">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="Atom"/>
<xs:element ref="Union"/>
</xs:choice>
</xs:complexType>
</xs:element>
…
