<?xml version="1.0"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="">
  <start>
    <element name="interface">
      <optional>
        <attribute name="domain">
          <text/>
        </attribute>
      </optional>
      <zeroOrMore>
        <choice>
          <ref name="requires"/>
          <ref name="object"/>
          <ref name="template"/>
          <ref name="menu"/>
        </choice>
      </zeroOrMore>
    </element>
  </start>
  <define name="requires">
    <element name="requires">
      <attribute name="lib">
        <text/>
      </attribute>
      <attribute name="version">
        <text/>
      </attribute>
    </element>
  </define>
  <define name="object">
    <element name="object">
      <optional>
        <attribute name="id">
          <data type="ID" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
        </attribute>
      </optional>
      <attribute name="class">
        <text/>
      </attribute>
      <optional>
        <attribute name="type-func">
          <text/>
        </attribute>
      </optional>
      <optional>
        <attribute name="constructor">
          <text/>
        </attribute>
      </optional>
      <zeroOrMore>
        <choice>
          <ref name="property"/>
          <ref name="signal"/>
          <ref name="child"/>
          <ref name="ANY"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="template">
    <element name="template">
      <attribute name="class">
        <text/>
      </attribute>
      <attribute name="parent">
        <text/>
      </attribute>
      <zeroOrMore>
        <choice>
          <ref name="property"/>
          <ref name="signal"/>
          <ref name="child"/>
          <ref name="ANY"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="property">
    <element name="property">
      <attribute name="name">
        <text/>
      </attribute>
      <optional>
        <attribute name="translatable">
          <choice>
            <value>yes</value>
            <value>no</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="comments">
          <text/>
        </attribute>
      </optional>
      <optional>
        <attribute name="context">
          <text/>
        </attribute>
      </optional>
      <optional>
        <group>
          <attribute name="bind-source">
            <text/>
          </attribute>
          <attribute name="bind-property">
            <text/>
          </attribute>
          <optional>
            <attribute name="bind-flags">
              <text/>
            </attribute>
          </optional>
        </group>
      </optional>
      <optional>
        <text/>
      </optional>
    </element>
  </define>
  <define name="signal">
    <element name="signal">
      <attribute name="name">
        <text/>
      </attribute>
      <attribute name="handler">
        <text/>
      </attribute>
      <optional>
        <attribute name="after">
          <text/>
        </attribute>
      </optional>
      <optional>
        <attribute name="swapped">
          <text/>
        </attribute>
      </optional>
      <optional>
        <attribute name="object">
          <text/>
        </attribute>
      </optional>
      <optional>
        <attribute name="last_modification_time">
          <text/>
        </attribute>
      </optional>
      <empty/>
    </element>
  </define>
  <define name="child">
    <element name="child">
      <optional>
        <attribute name="type">
          <text/>
        </attribute>
      </optional>
      <optional>
        <attribute name="internal-child">
          <text/>
        </attribute>
      </optional>
      <zeroOrMore>
        <choice>
          <ref name="object"/>
          <ref name="ANY"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="menu">
    <element name="menu">
      <attribute name="id">
        <data type="ID" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
      </attribute>
      <optional>
        <attribute name="domain">
          <text/>
        </attribute>
      </optional>
      <zeroOrMore>
        <choice>
          <ref name="item"/>
          <ref name="submenu"/>
          <ref name="section"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="item">
    <element name="item">
      <optional>
        <attribute name="id">
          <data type="ID" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
        </attribute>
      </optional>
      <zeroOrMore>
        <choice>
          <ref name="attribute_"/>
          <ref name="link"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="attribute_">
    <element name="attribute">
      <attribute name="name">
        <text/>
      </attribute>
      <optional>
        <attribute name="type">
          <text/>
        </attribute>
      </optional>
      <optional>
        <attribute name="translatable">
          <choice>
            <value>yes</value>
            <value>no</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="context">
          <text/>
        </attribute>
      </optional>
      <optional>
        <attribute name="comments">
          <text/>
        </attribute>
      </optional>
      <optional>
        <text/>
      </optional>
    </element>
  </define>
  <define name="link">
    <element name="link">
      <optional>
        <attribute name="id">
          <data type="ID" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
        </attribute>
      </optional>
      <attribute name="name">
        <text/>
      </attribute>
      <zeroOrMore>
        <ref name="item"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="submenu">
    <element name="submenu">
      <optional>
        <attribute name="id">
          <data type="ID" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
        </attribute>
      </optional>
      <zeroOrMore>
        <choice>
          <ref name="attribute_"/>
          <ref name="item"/>
          <ref name="submenu"/>
          <ref name="section"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="section">
    <element name="section">
      <optional>
        <attribute name="id">
          <data type="ID" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"/>
        </attribute>
      </optional>
      <zeroOrMore>
        <choice>
          <ref name="attribute_"/>
          <ref name="item"/>
          <ref name="submenu"/>
          <ref name="section"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="ANY">
    <element>
      <anyName>
        <except>
          <name>interface</name>
          <name>requires</name>
          <name>object</name>
          <name>property</name>
          <name>signal</name>
          <name>child</name>
          <name>menu</name>
          <name>item</name>
          <name>attribute</name>
          <name>link</name>
          <name>submenu</name>
          <name>section</name>
        </except>
      </anyName>
      <zeroOrMore>
        <attribute>
          <anyName/>
          <text/>
        </attribute>
      </zeroOrMore>
      <interleave>
        <zeroOrMore>
          <ref name="ALL"/>
        </zeroOrMore>
        <optional>
          <text/>
        </optional>
      </interleave>
    </element>
  </define>
  <define name="ALL">
    <element>
      <anyName/>
      <zeroOrMore>
        <attribute>
          <anyName/>
          <text/>
        </attribute>
      </zeroOrMore>
      <interleave>
        <zeroOrMore>
          <ref name="ALL"/>
        </zeroOrMore>
        <optional>
          <text/>
        </optional>
      </interleave>
    </element>
  </define>
</grammar>