
<!-- ==============================================================
      SVG12-RNG | Animation
     ============================================================== -->

<grammar ns='http://www.w3.org/2000/svg'
         xml:lang='en'
         xmlns='http://relaxng.org/ns/structure/1.0'
         xmlns:a='http://relaxng.org/ns/compatibility/annotations/1.0'
         datatypeLibrary='http://www.w3.org/2001/XMLSchema-datatypes'
         >

  <define name='SVG.Animation.class' combine='choice'>
    <choice>
      <ref name='animate'/>
      <ref name='set'/>
      <ref name='animateMotion'/>
      <ref name='animateColor'/>
      <ref name='animateTransform'/>
    </choice>
  </define>



  <define name='SVG.Animation.attrib'>
    <ref name='SVG.XLink.attrib'/>
  </define>



  <define name='SVG.AnimationAttribute.attrib'>
    <attribute name='attributeName'/>
    <optional>
      <attribute name='attributeType'/>
    </optional>
  </define>



  <define name='SVG.AnimationTiming.attrib'>
    <optional><attribute name='begin'/></optional>
    <optional><attribute name='dur'/></optional>
    <optional><attribute name='end'/></optional>
    <optional><attribute name='min'/></optional>
    <optional><attribute name='max'/></optional>
    <optional><attribute name='repeatCount'/></optional>
    <optional><attribute name='repeatDur'/></optional>
    <optional>
      <attribute name='restart' a:defaultValue='always'>
        <choice>
          <value>always</value>
          <value>never</value>
          <value>whenNotActive</value>
        </choice>
      </attribute>
    </optional>
    <optional>
      <attribute name='fill' a:defaultValue='remove'>
        <choice>
          <value>remove</value>
          <value>freeze</value>
        </choice>
      </attribute>
    </optional>
  </define>



  <define name='SVG.AnimationValue.attrib'>
    <optional>
      <attribute name='calcMode' a:defaultValue='linear'>
        <choice>
          <value>discrete</value>
          <value>linear</value>
          <value>paced</value>
          <value>spline</value>
        </choice>
      </attribute>
    </optional>
    <optional><attribute name='values'/></optional>
    <optional><attribute name='keyTimes'/></optional>
    <optional><attribute name='keySplines'/></optional>
    <optional><attribute name='from'/></optional>
    <optional><attribute name='to'/></optional>
    <optional><attribute name='by'/></optional>
  </define>



  <define name='SVG.AnimationAddition.attrib'>
    <optional>
      <attribute name='additive' a:defaultValue='replace'>
        <choice>
          <value>replace</value>
          <value>sum</value>
        </choice>
      </attribute>
    </optional>
    <optional>
      <attribute name='accumulate' a:defaultValue='none'>
        <choice>
          <value>none</value>
          <value>sum</value>
        </choice>
      </attribute>
    </optional>
  </define>





  <define name='SVG.animate.content'>
    <zeroOrMore>
      <ref name='SVG.Description.class'/>
    </zeroOrMore>
  </define>

  <define name='animate'>
    <element name='animate'>
      <ref name='attlist.animate'/>
      <ref name='SVG.animate.content'/>
    </element>
  </define>

  <define name='attlist.animate' combine='interleave'>
    <ref name='SVG.Core.attrib'/>
    <ref name='SVG.Conditional.attrib'/>
    <ref name='SVG.AnimationEvents.attrib'/>
    <ref name='SVG.External.attrib'/>
    <ref name='SVG.Animation.attrib'/>
    <ref name='SVG.AnimationAttribute.attrib'/>
    <ref name='SVG.AnimationTiming.attrib'/>
    <ref name='SVG.AnimationValue.attrib'/>
    <ref name='SVG.AnimationAddition.attrib'/>
  </define>





  <define name='SVG.set.content'>
    <zeroOrMore>
      <ref name='SVG.Description.class'/>
    </zeroOrMore>
  </define>

  <define name='set'>
    <element name='set'>
      <ref name='attlist.set'/>
      <ref name='SVG.set.content'/>
    </element>
  </define>

  <define name='attlist.set' combine='interleave'>
    <ref name='SVG.Core.attrib'/>
    <ref name='SVG.Conditional.attrib'/>
    <ref name='SVG.AnimationEvents.attrib'/>
    <ref name='SVG.External.attrib'/>
    <ref name='SVG.Animation.attrib'/>
    <ref name='SVG.AnimationAttribute.attrib'/>
    <ref name='SVG.AnimationTiming.attrib'/>
    <optional>
      <attribute name='to'/>
    </optional>
  </define>





  <define name='SVG.animateMotion.content'>
    <zeroOrMore>
      <ref name='SVG.Description.class'/>
    </zeroOrMore>
    <optional>
      <ref name='mpath'/>
    </optional>
  </define>

  <define name='animateMotion'>
    <element name='animateMotion'>
      <ref name='attlist.animateMotion'/>
      <ref name='SVG.animateMotion.content'/>
    </element>
  </define>

  <define name='attlist.animateMotion' combine='interleave'>
    <ref name='SVG.Core.attrib'/>
    <ref name='SVG.Conditional.attrib'/>
    <ref name='SVG.AnimationEvents.attrib'/>
    <ref name='SVG.External.attrib'/>
    <ref name='SVG.Animation.attrib'/>
    <ref name='SVG.AnimationTiming.attrib'/>
    <ref name='SVG.AnimationAddition.attrib'/>
    <optional>
      <attribute name='calcMode' a:defaultValue='paced'>
        <choice>
          <value>discrete</value>
          <value>linear</value>
          <value>paced</value>
          <value>spline</value>
        </choice>
      </attribute>
    </optional>
    <optional><attribute name='values'/></optional>
    <optional><attribute name='keyTimes'/></optional>
    <optional><attribute name='keySplines'/></optional>
    <optional><attribute name='from'/></optional>
    <optional><attribute name='to'/></optional>
    <optional><attribute name='by'/></optional>
    <optional><attribute name='path'/></optional>
    <optional><attribute name='keyPoints'/></optional>
    <optional><attribute name='rotate'/></optional>
    <optional><attribute name='origin'/></optional>
  </define>





  <define name='SVG.animateColor.content'>
    <zeroOrMore>
      <ref name='SVG.Description.class'/>
    </zeroOrMore>
  </define>

  <define name='animateColor'>
    <element name='animateColor'>
      <ref name='attlist.animateColor'/>
      <ref name='SVG.animateColor.content'/>
    </element>
  </define>

  <define name='attlist.animateColor' combine='interleave'>
    <ref name='SVG.Core.attrib'/>
    <ref name='SVG.Conditional.attrib'/>
    <ref name='SVG.AnimationEvents.attrib'/>
    <ref name='SVG.External.attrib'/>
    <ref name='SVG.Animation.attrib'/>
    <ref name='SVG.AnimationAttribute.attrib'/>
    <ref name='SVG.AnimationTiming.attrib'/>
    <ref name='SVG.AnimationValue.attrib'/>
    <ref name='SVG.AnimationAddition.attrib'/>
  </define>



  <define name='SVG.animateTransform.content'>
    <zeroOrMore>
      <ref name='SVG.Description.class'/>
    </zeroOrMore>
  </define>

  <define name='animateTransform'>
    <element name='animateTransform'>
      <ref name='attlist.animateTransform'/>
      <ref name='SVG.animateTransform.content'/>
    </element>
  </define>

  <define name='attlist.animateTransform' combine='interleave'>
    <ref name='SVG.Core.attrib'/>
    <ref name='SVG.Conditional.attrib'/>
    <ref name='SVG.AnimationEvents.attrib'/>
    <ref name='SVG.External.attrib'/>
    <ref name='SVG.Animation.attrib'/>
    <ref name='SVG.AnimationAttribute.attrib'/>
    <ref name='SVG.AnimationTiming.attrib'/>
    <ref name='SVG.AnimationValue.attrib'/>
    <ref name='SVG.AnimationAddition.attrib'/>
    <optional>
      <attribute name='type' a:defaultValue='translate'>
        <choice>
          <value>translate</value>
          <value>scale</value>
          <value>rotate</value>
          <value>skewX</value>
          <value>skewY</value>
        </choice>
      </attribute>
    </optional>
  </define>





  <define name='SVG.mpath.content'>
    <zeroOrMore>
      <ref name='SVG.Description.class'/>
    </zeroOrMore>
  </define>

  <define name='mpath'>
    <element name='mpath'>
      <ref name='attlist.mpath'/>
      <ref name='SVG.mpath.content'/>
    </element>
  </define>

  <define name='attlist.mpath' combine='interleave'>
    <ref name='SVG.Core.attrib'/>
    <ref name='SVG.XLinkRequired.attrib'/>
    <ref name='SVG.External.attrib'/>
  </define>

</grammar>
