<?xml version="1.0" encoding="utf-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
  ns="http://groupserver.org/XML_Name_Spaces/log">
  <start>
    <element name="log">

      <element name="system">
        <data type="string" />
      </element>

      <element name="subject">
        <ref name="objId"/>
      </element>

      <element name="action">
        <attribute name="code">
          <data type="positiveInteger" />
        </attribute>
        <text />
      </element>

      <optional>
        <element name="object">
          <ref name="objId"/>
        </element>
      </optional>

      <optional>
        <element name="description">
          <ref name="anyElement"/>
        </element>
      </optional>    
    </element>
  </start>

  <define name="anyElement">
    <element>
      <anyName/>
      <zeroOrMore>
      	<choice>
      	  <attribute>
      	    <anyName/>
      	  </attribute>
      	  <text/>
      	  <ref name="anyElement"/>
      	</choice>
      </zeroOrMore>
    </element>
  </define>
  
  <define name="objId">
    <choice>
      <ref name="literal"/>
      <ref name="siteId"/>
      <ref name="groupId"/>
      <ref name="userId"/>
      <ref name="topicId"/>
      <ref name="postId"/>
      <ref name="postedFileId"/>
      <ref name="fileId"/>
      <ref name="pageId"/>
    </choice>
  </define>

  <define name="literal">
    <element name="literal">
      <data type="string"/>
    </element>
  </define>

  <define name="userId">
    <element name="user">
      <data type="string"/>
    </element>
  </define>
  <define name="siteId">
    <element name="site">
      <data type="string"/>
    </element>
  </define>
  <define name="groupId">
    <element name="group">
      <attribute name="site">
        <data type="string"/>
      </attribute>
      <data type="string"/>
    </element>
  </define>
  <define name="topicId">
    <element name="topic">
      <data type="string"/>
    </element>
  </define>
  <define name="postId">
    <element name="post">
      <data type="string"/>
    </element>
  </define>
  <define name="postedFileId">
    <element name="posted-file">
      <data type="string"/>
    </element>
  </define>
  <define name="fileId">
    <element name="file">
      <data type="string"/>
    </element>
  </define>
  <define name="pageId">
    <element name="page">
      <data type="string"/>
    </element>
  </define>
</grammar>
  
