 <?xml version="1.0"?>
     <grammar xmlns="http://relaxng.org/ns/structure/1.0"
      ns="urn:ietf:params:xml:ns:mediadataset"
      datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">

        <start>
           <choice>
                 <element name="session-info">
                     <interleave>
                     <optional>
                         <ref name="ElementStreams"/>
                     </optional>
                     <zeroOrMore>
                         <ref name="ElementMaxBandwidth"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementMaxSessionBandwidth"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementMaxStreamBandwidth"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementMediaIntermediaries"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementQoSDSCP"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementAny"/>
                     </zeroOrMore>
                     </interleave>
                 </element>

                 <element name="session-policy">
                     <interleave>
                     <optional>
                         <ref name="ElementContext"/>
                     </optional>
                     <optional>
                         <ref name="ElementLocalPorts"/>
                     </optional>
                     <zeroOrMore>
                         <ref name="ElementMediaTypesAllowed"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementMediaTypesExcluded"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementCodecsAllowed"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementCodecsExcluded"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementMaxBandwidth"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementMaxSessionBandwidth"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementMaxStreamBandwidth"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementQoSDSCP"/>
                     </zeroOrMore>
                     <zeroOrMore>
                         <ref name="ElementAny"/>
                     </zeroOrMore>
                     </interleave>
                </element>
             </choice>
         </start>

         <define name="ElementMediaTypesAllowed">
             <element name="media-types-allowed">
                 <ref name="PolicyGeneralAttributes"/>
                 <zeroOrMore>
                    <ref name="ElementMediaType"/>
                 </zeroOrMore>
             </element>
         </define>

         <define name="ElementMediaTypesExcluded">
             <element name="media-types-excluded">
                 <ref name="PolicyGeneralAttributes"/>
                  <zeroOrMore>
                    <ref name="ElementMediaType"/>
                 </zeroOrMore>
             </element>
         </define>

         <define name="ElementMediaType">
             <element name="media-type">
                 <data type="string" />
                 <optional>
                   <ref name="AttributeQ"/>
                 </optional>
                 <optional>
                   <ref name="AttributeGeneric"/>
                 </optional>
             </element>
         </define>

         <define name="ElementCodecsAllowed">
             <element name="codecs-allowed">
               <ref name="PolicyGeneralAttributes"/>
                 <zeroOrMore>
                    <ref name="ElementCodec"/>
                 </zeroOrMore>
             </element>
         </define>

         <define name="ElementCodecsExcluded">
             <element name="codecs-excluded">
               <ref name="PolicyGeneralAttributes"/>
                 <zeroOrMore>
                    <ref name="ElementCodec"/>
                 </zeroOrMore>
             </element>
         </define>

         <define name="ElementCodec">
             <element name="codec">
                 <optional>
                   <ref name="AttributeQ"/>
                 </optional>
                 <optional>
                   <ref name="AttributeGeneric"/>
                 </optional>
                 <element name="media-type-subtype">
                   <data type="string" />
                 </element>
                 <zeroOrMore>
                   <element name="mime-parameter">
                     <data type="string" />
                   </element>
                 </zeroOrMore>
             </element>
         </define>

         <define name="ElementStreams">
             <element name="streams">
                 <optional>
                   <ref name="AttributeGeneric"/>
                 </optional>
                 <zeroOrMore>
                   <ref name="ElementStream"/>
                 </zeroOrMore>
             </element>
         </define>

         <define name="ElementStream">
             <element name="stream">
                 <optional>
                   <ref name="AttributeDirection"/>
                 </optional>
                 <optional>
                   <ref name="AttributeLabel"/>
                 </optional>
                 <optional>
                   <ref name="AttributeEnabled"/>
                 </optional>
                 <optional>
                   <ref name="AttributeGeneric"/>
                 </optional>
                 <ref name="ElementMediaType"/>
                 <oneOrMore>
                   <ref name="ElementCodec"/>
                 </oneOrMore>
                 <element name="local-host-port">
                   <data type="string" />
                 </element>
                 <optional>
                   <element name="remote-host-port">
                     <data type="string" />
                   </element>
                 </optional>
             </element>
         </define>

         <define name="ElementMaxBandwidth">
            <element name="max-bw">
                 <data type="integer" />
                 <ref name="PolicyGeneralAttributes"/>
             </element>
         </define>

         <define name="ElementMaxSessionBandwidth">
             <element name="max-session-bw">
                 <data type="integer" />
                 <ref name="PolicyGeneralAttributes"/>
             </element>
         </define>

         <define name="ElementMaxStreamBandwidth">
             <element name="max-stream-bw">
                 <data type="integer" />
                 <ref name="PolicyGeneralAttributes"/>
                 <optional>
                   <ref name="AttributeMediaType"/>
                 </optional>
                 <optional>
                   <ref name="AttributeLabel"/>
                 </optional>
             </element>
         </define>

         <define name="ElementMediaIntermediaries">
             <element name="media-intermediaries">
                <ref name="PolicyGeneralAttributes"/>
                 <oneOrMore>
                   <choice>
                     <element name="fixed-intermediary">
                       <element name="int-host-port">
                         <data type="string" />
                       </element>
                       <zeroOrMore>
                         <element name="int-addl-port">
                           <data type="integer" />
                         </element>
                       </zeroOrMore>
                     </element>

                     <element name="turn-intermediary">
                       <element name="int-host-port">
                         <data type="string" />
                       </element>
                       <zeroOrMore>
                         <element name="int-addl-port">
                           <data type="integer" />
                         </element>
                       </zeroOrMore>
                       <zeroOrMore>
                         <element name="shared-secret">
                           <data type="string" />
                         </element>
                       </zeroOrMore>
                     </element>
                   </choice>
                 </oneOrMore>
             </element>
         </define>

         <define name="ElementQoSDSCP">
             <element name="qos-dscp">
                 <data type="integer" />
                 <ref name="PolicyGeneralAttributes"/>
                 <optional>
                   <ref name="AttributeMediaType"/>
                 </optional>
             </element>
         </define>

         <define name="ElementLocalPorts">
             <element name="local-ports">
                 <data type="string" />
                 <interleave>
                   <optional>
                     <ref name="AttributeVisibility"/>
                   </optional>
                   <optional>
                     <ref name="AttributeGeneric"/>
                   </optional>
                </interleave>
             </element>
         </define>

         <define name="ElementContext">
             <element name="context">
                 <interleave>
                 <optional>
                   <element name="info">
                     <data type="string" />
                   </element>
                 </optional>
                  <optional>
                  <element name="policy-server-URI">
                     <data type="string" />
                   </element>
                 </optional>
                  <optional>
                  <element name="token">
                     <data type="token" />
                   </element>
                 </optional>
                 <optional>
                  <element name="request-URI">
                     <data type="string" />
                   </element>
                 </optional>
                  <zeroOrMore>
                   <element name="contact">
                      <data type="string" />
                   </element>
                 </zeroOrMore>
                 </interleave>
             </element>
         </define>

         <define name="PolicyGeneralAttributes">
                   <optional>
                     <ref name="AttributeVisibility"/>
                   </optional>
                   <optional>
                     <ref name="AttributeDirection"/>
                   </optional>
                   <optional>
                     <ref name="AttributeGeneric"/>
                   </optional>
         </define>


        <define name="AttributeVisibility">
            <attribute name="visibility">
              <choice>
                <value>hidden</value>
                <value>visible</value>
              </choice>
            </attribute>
        </define>

        <define name="AttributeDirection">
            <attribute name="direction">
              <choice>
                <value>sendonly</value>
                <value>recvonly</value>
                <value>sendrecv</value>
              </choice>
            </attribute>
        </define>

        <define name="AttributeQ">
            <attribute name="q">
              <data type="decimal" />
            </attribute>
        </define>

        <define name="AttributeMediaType">
            <attribute name="media-type">
              <data type="string" />
            </attribute>
        </define>

        <define name="AttributeLabel">
            <attribute name="label">
              <data type="string" />
            </attribute>
        </define>

        <define name="AttributeEnabled">
            <attribute name="enabled">
              <data type="boolean" />
            </attribute>
        </define>

         <define name="AttributeGeneric">
             <zeroOrMore>
              <attribute>
               <anyName>
                <except>
                 <name ns="">visibility</name>
                 <name ns="">direction</name>
                 <name ns="">q</name>
                 <name ns="">media-type</name>
                 <name ns="">label</name>
                 <name ns="">enabled</name>
                </except>
               </anyName>
              </attribute>
             </zeroOrMore>
         </define>

         <define name="ElementAny">
           <element>
             <anyName>
               <except>
                 <name>context</name>
                 <name>streams</name>
                 <name>max-bw</name>
                 <name>max-session-bw</name>
                 <name>max-stream-bw</name>
                 <name>media-intermediaries</name>
                 <name>qos-dscp</name>
                 <name>local-ports</name>
                 <name>media-types-allowed</name>
                 <name>media-types-excluded</name>
                 <name>media-type</name>
                 <name>codecs-allowed</name>
                 <name>codecs-excluded</name>
               </except>
             </anyName>
             <ref name="anyExtension"/>
           </element>
         </define>

         <define name="anyExtension">
           <zeroOrMore>
             <choice>
               <element>
                 <anyName/>
                 <ref name="anyExtension"/>
               </element>
               <attribute>
                 <anyName/>
               </attribute>
               <text/>
             </choice>
           </zeroOrMore>
         </define>

     </grammar>