<?xml version="1.0" encoding="utf-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0" ns="http://www.w3.org/2002/01/P3Pv1"  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">

<!-- P3P root element -->

<start combine="choice">
 <choice>
  <ref name="META.qn"/>
  <ref name="POLICIES.qn"/>
 </choice>
</start>

<!-- Basic P3P Datatypes -->

<define name="p3p-att-xmllang">
 <attribute name="xml:lang">
  <data type="language"/>
 </attribute>
</define>

<define name="p3p-yesOrNo">
 <choice>
  <value>yes</value>
  <value>no</value>
 </choice>
</define>

<!-- Definition of elements -->

<define name="META.qn">
 <element name="META">
  <ref name="p3p-extention"/>
  <ref name="POLICY-REFERENCES.qn"/>
  <optional>
   <ref name="POLICIES.qn"/>
  </optional>
  <ref name="p3p-extention"/>
  <optional>
   <ref name="p3p-att-xmllang"/>
  </optional>
 </element>
</define>

<define name="POLICY-REFERENCES.qn">
 <element name="POLICY-REFERENCES">
  <optional>
   <ref name="EXPIRY.qn"/>
  </optional>
  <zeroOrMore>
   <ref name="POLICY-REF.qn"/>
  </zeroOrMore>
  <zeroOrMore>
   <ref name="HINT.qn"/>
  </zeroOrMore>
  <ref name="p3p-extention"/>
 </element>
</define>

<define name="POLICY-REF.qn">
 <element name="POLICY-REF">
  <zeroOrMore>
   <element name="INCLUDE">
    <data type="anyURI"/>
   </element>
  </zeroOrMore>
  <zeroOrMore>
   <element name="EXCLUDE">
    <data type="anyURI"/>
   </element>
  </zeroOrMore>
  <zeroOrMore>
   <element name="COOKIE-INCLUDE">
    <ref name="p3p-cookie-element"/>
   </element>
  </zeroOrMore>
  <zeroOrMore>
   <element name="COOKIE-EXCLUDE">
    <ref name="p3p-cookie-element"/>
   </element>
  </zeroOrMore>
  <zeroOrMore>
   <element name="METHOD">
    <text/> <!-- defined in the section 5.1.1 of [HTTP1.1]  -->
   </element>
  </zeroOrMore>
  <zeroOrMore>
   <ref name="EXTENSION.qn"/>
  </zeroOrMore>
  <attribute name="about">
   <data type="anyURI"/>
  </attribute>
 </element>
</define>

<define name="p3p-cookie-element">
 <empty/>
 <optional>
  <attribute name="name">
   <text/>
  </attribute>
 </optional>
 <optional>
  <attribute name="value">
   <text/>
  </attribute>
 </optional>
 <optional>
  <attribute name="domain">
   <text/>
  </attribute>
 </optional>
 <optional>
  <attribute name="path">
   <text/>
  </attribute>
 </optional>
</define>

<define name="HINT.qn">
 <element name="HINT">
 <empty/>
  <attribute name="scope">
   <text/> <!-- scheme ( `://` | `:/` ) authority ; the wildcard can only be at the start  -->
  </attribute>
  <attribute name="path">
   <data type="anyURI"/>
  </attribute>
 </element>
</define>

<define name="POLICIES.qn">
 <element name="POLICIES">
  <optional>
   <ref name="EXPIRY.qn"/>
  </optional>
  <optional>
   <ref name="DATASCHEMA.qn"/>
  </optional>
  <zeroOrMore>
   <ref name="POLICY.qn"/>
  </zeroOrMore>
  <optional>
   <ref name="p3p-att-xmllang"/>
  </optional>
 </element>
</define>

<define name="EXPIRY.qn">
 <element name="EXPIRY">
  <empty/>
  <choice>
   <attribute name="max-age">
    <data type="nonNegativeInteger"/>
   </attribute>
   <attribute name="date">
    <text/>
   </attribute>
  </choice>
 </element>
</define>

<define name="POLICY.qn">
 <element name="POLICY">
  <ref name="p3p-extention"/>
  <optional>
   <ref name="TEST.qn"/>
  </optional>
  <ref name="ENTITY.qn"/>
  <ref name="ACCESS.qn"/>
  <optional>
   <ref name="DISPUTES-GROUP.qn"/>
  </optional>
  <oneOrMore>
   <ref name="STATEMENT.qn"/>
  </oneOrMore>
  <ref name="p3p-extention"/>
  <attribute name="discuri">
   <data type="anyURI"/>
  </attribute>
  <optional>
   <attribute name="opturi">
    <data type="anyURI"/>
   </attribute>
  </optional>
  <attribute name="name">
   <data type="ID"/>
  </attribute>
  <optional>
   <ref name="p3p-att-xmllang"/>
  </optional>
 </element>
</define>

<define name="TEST.qn">
 <element name="TEST">
  <empty/>
 </element>
</define>

<define name="ENTITY.qn">
 <element name="ENTITY">
  <ref name="p3p-extention"/>
  <element name="DATA-GROUP">
   <oneOrMore>
    <element name="DATA">
     <ref name="p3p-data-in-entity"/>
    </element>
   </oneOrMore>
  </element>
  <ref name="p3p-extention"/>
 </element>
</define>

<define name="p3p-data-in-entity">
 <text/>
 <attribute name="ref">
  <data type="anyURI"/>
 </attribute>
</define>

<define name="ACCESS.qn">
 <element name="ACCESS">
  <ref name="p3p-extention"/>
  <element>
   <choice>
    <name>nonident</name>
    <name>ident-contact</name>
    <name>other-ident</name>
    <name>contact-and-other</name>
    <name>all</name>
    <name>none</name>
   </choice>
   <ref name="p3p-access-value"/>
   </element>
  <ref name="p3p-extention"/>
 </element>
</define>

<define name="p3p-access-value">
 <empty/>
</define>

<define name="DISPUTES-GROUP.qn">
 <element name="DISPUTES-GROUP">
  <ref name="p3p-extention"/>
  <oneOrMore>
   <ref name="DISPUTES.qn"/>
  </oneOrMore>
  <ref name="p3p-extention"/>
 </element>
</define>

<define name="DISPUTES.qn">
 <element name="DISPUTES">
  <ref name="p3p-extention"/>
  <optional>
   <choice>
    <group>
     <ref name="LONG-DESCRIPTION.qn"/>
     <optional>
      <ref name="IMG.qn"/>
     </optional>
     <optional>
      <ref name="REMEDIES.qn"/>
     </optional>
    </group>
    <group>
     <ref name="IMG.qn"/>
     <optional>
      <ref name="REMEDIES.qn"/>
     </optional>
    </group>
    <ref name="REMEDIES.qn"/>
   </choice>
  </optional>
  <ref name="p3p-extention"/>
  <attribute name="resolution-type">
   <choice>
    <value>service</value>
    <value>independent</value>
    <value>court</value>
    <value>law</value>
   </choice>
  </attribute>
  <attribute name="service">
   <data type="anyURI"/>
  </attribute>
  <optional>
   <attribute name="verification">
   <text/>
   </attribute>
  </optional>
  <optional>
   <attribute name="short-description">
    <text/>
   </attribute>
  </optional>
 </element>
</define>

<define name="LONG-DESCRIPTION.qn">
 <element name="LONG-DESCRIPTION">
  <text/>
 </element>
</define>

<define name="IMG.qn">
 <element name="IMG">
  <empty/>
  <attribute name="src">
   <data type="anyURI"/>
  </attribute>
  <optional>
   <attribute name="width">
    <data type="nonNegativeInteger"/>
   </attribute>
  </optional>
  <optional>
   <attribute name="height">
    <data type="nonNegativeInteger"/>
   </attribute>
  </optional>
  <attribute name="alt">
   <text/>
  </attribute>
 </element>
</define>

<define name="REMEDIES.qn">
 <element name="REMEDIES">
  <ref name="p3p-extention"/>
  <oneOrMore>
   <element>
    <choice>
     <name>correct</name>
     <name>money</name>
     <name>law</name>
    </choice>
    <ref name="p3p-remedies-value"/>
   </element>
  </oneOrMore>
  <ref name="p3p-extention"/>
 </element>
</define>

<define name="p3p-remedies-value">
 <empty/>
</define>

<define name="STATEMENT.qn">
 <element name="STATEMENT">
  <ref name="p3p-extention"/>
  <optional>
   <element name="CONSEQUENCE">
    <text/>
   </element>
  </optional>
  <choice>
   <group>
    <ref name="PURPOSE.qn"/>
    <ref name="RECIPIENT.qn"/>
    <ref name="RETENTION.qn"/>
    <oneOrMore>
     <element name="DATA-GROUP">
      <ref name="p3p-data-group-type"/>
     </element>
    </oneOrMore>
   </group>
   <group>
    <element name="NON-IDENTIFIABLE">
     <empty/>
    </element>
    <optional>
     <ref name="PURPOSE.qn"/>
    </optional>
    <optional>
     <ref name="RECIPIENT.qn"/>
    </optional>
    <optional>
     <ref name="RETENTION.qn"/>
    </optional>
    <zeroOrMore>
     <element name="DATA-GROUP">
      <ref name="p3p-data-group-type"/>
     </element>
    </zeroOrMore>
   </group>
  </choice>
  <ref name="p3p-extention"/>
 </element>
</define>

<define name="PURPOSE.qn">
 <element name="PURPOSE">
  <ref name="p3p-extention"/>
  <oneOrMore>
   <choice>
    <element name="current">
     <empty/>
    </element>
    <element name="admin">
     <ref name="p3p-purpose-value"/>
    </element>
    <element name="develop">
     <ref name="p3p-purpose-value"/>
    </element>
    <element name="tailoring">
     <ref name="p3p-purpose-value"/>
    </element>
    <element name="pseudo-analysis">
     <ref name="p3p-purpose-value"/>
    </element>
    <element name="pseudo-decision">
     <ref name="p3p-purpose-value"/>
    </element>
    <element name="individual-analysis">
     <ref name="p3p-purpose-value"/>
    </element>
    <element name="individual-decision">
     <ref name="p3p-purpose-value"/>
    </element>
    <element name="contact">
     <ref name="p3p-purpose-value"/>
    </element>
    <element name="historical">
     <ref name="p3p-purpose-value"/>
    </element>
    <element name="telemarketing">
     <ref name="p3p-purpose-value"/>
    </element>
    <element name="other-purpose">
     <text/>
     <ref name="p3p-purpose-value"/>
    </element>
   </choice>
  </oneOrMore>
  <ref name="p3p-extention"/>
 </element>
</define>

<define name="p3p-required-value">
 <choice>
  <value>always</value>
  <value>opt-in</value>
  <value>opt-out</value>
 </choice>
</define>

<define name="p3p-purpose-value">
 <empty/>
 <optional>
  <attribute name="required">
   <ref name="p3p-required-value"/>
  </attribute>
 </optional>
</define>

<define name="RECIPIENT.qn">
 <element name="RECIPIENT">
  <ref name="p3p-extention"/>
  <oneOrMore>
   <choice>
    <element name="ours">
     <zeroOrMore>
      <ref name="recipient-description.qn"/>
     </zeroOrMore>
    </element>
    <element name="same">
     <ref name="p3p-recipient-value"/>
    </element>
    <element name="other-recipient">
     <ref name="p3p-recipient-value"/>
    </element>
    <element name="delivery">
     <ref name="p3p-recipient-value"/>
    </element>
    <element name="public">
     <ref name="p3p-recipient-value"/>
    </element>
    <element name="unrelated">
     <ref name="p3p-recipient-value"/>
    </element>
   </choice>
  </oneOrMore>
  <ref name="p3p-extention"/>
 </element>
</define>

<define name="p3p-recipient-value">
 <zeroOrMore>
  <ref name="recipient-description.qn"/>
 </zeroOrMore>
 <optional>
  <attribute name="required">
   <ref name="p3p-required-value"/>
  </attribute>
 </optional>
</define>

<define name="recipient-description.qn">
 <element name="recipient-description">
  <text/>
 </element>
</define>

<define name="RETENTION.qn">
 <element name="RETENTION">
  <ref name="p3p-extention"/>
  <choice>
   <element name="no-retention">
    <ref name="p3p-retention-value"/>
   </element>
   <element name="stated-purpose">
    <ref name="p3p-retention-value"/>
   </element>
   <element name="legal-requirement">
    <ref name="p3p-retention-value"/>
   </element>
   <element name="indefinitely">
    <ref name="p3p-retention-value"/>
   </element>
   <element name="business-practices">
    <ref name="p3p-retention-value"/>
   </element>
  </choice>
  <ref name="p3p-extention"/>
 </element>
</define>

<define name="p3p-retention-value">
 <empty/>
</define>

<define name="DATA-GROUP.qn">
 <element name="DATA-GROUP">
  <ref name="p3p-data-group-type"/>
 </element>
</define>

<define name="p3p-data-group-type">
 <ref name="p3p-extention"/>
 <oneOrMore>
  <element name="DATA">
   <ref name="p3p-data-in-statement"/>
  </element>
 </oneOrMore>
 <ref name="p3p-extention"/>
 <optional>
  <attribute name="base">
   <data type="anyURI"/>
  </attribute>
 </optional>
</define>

<define name="p3p-data-in-statement">
 <mixed>
  <zeroOrMore>
   <ref name="CATEGORIES.qn"/>
  </zeroOrMore>
 </mixed>
 <attribute name="ref">
  <data type="anyURI"/>
 </attribute>
 <optional>
  <attribute name="optional">
   <ref name="p3p-yesOrNo"/>
  </attribute>
 </optional>
</define>

<define name="DATASCHEMA.qn">
 <element name="DATASCHEMA">
  <zeroOrMore>
   <choice>
    <ref name="DATA-DEF.qn"/>
    <ref name="DATA-STRUCT.qn"/>
    <ref name="EXTENSION.qn"/>
   </choice>
  </zeroOrMore>
  <optional>
   <ref name="p3p-att-xmllang"/>
  </optional>
 </element>
</define>

<define name="DATA-DEF.qn">
 <element name="DATA-DEF">
  <ref name="p3p-data-def"/>
 </element>
</define>

<define name="DATA-STRUCT.qn">
 <element name="DATA-STRUCT">
  <ref name="p3p-data-def"/>
 </element>
</define>

<define name="p3p-data-def">
 <optional>
  <ref name="CATEGORIES.qn"/>
 </optional>
 <optional>
  <ref name="LONG-DESCRIPTION.qn"/>
 </optional>
 <attribute name="name">
  <data type="ID"/>
 </attribute>
 <optional>
  <attribute name="structref">
   <data type="anyURI"/>
  </attribute>
 </optional>
 <optional>
  <attribute name="short-description">
   <text/>
  </attribute>
 </optional>
</define>

<define name="CATEGORIES.qn">
 <element name="CATEGORIES">
  <oneOrMore>
   <choice>
    <element name="physical">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="online">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="uniqueid">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="purchase">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="financial">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="computer">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="navigation">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="interactive">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="demographic">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="content">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="state">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="political">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="health">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="preference">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="location">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="government">
     <ref name="p3p-categories-value"/>
    </element>
    <element name="other-category">
     <text/>
    </element>
   </choice>
  </oneOrMore>
 </element>
</define>

<define name="p3p-categories-value">
 <empty/>
</define>

<define name="p3p-extention">
 <zeroOrMore>
  <ref name="EXTENSION.qn"/>
 </zeroOrMore>
</define>


<define name="EXTENSION.qn">
 <element name="EXTENSION">
  <mixed>
   <zeroOrMore>
    <ref name="p3p-anyName"/>
   </zeroOrMore>
  </mixed>
  <optional>
   <attribute name="optional">
    <ref name="p3p-yesOrNo"/>
   </attribute>
  </optional>
 </element>
</define>

<define name="p3p-anyName">
 <element>
  <anyName>
   <except><nsName ns="http://www.w3.org/2002/01/P3Pv1"/></except>
  </anyName>
  <mixed>
   <zeroOrMore>
    <ref name="p3p-anyName"/>
   </zeroOrMore>
  </mixed>
  <zeroOrMore>
   <attribute>
    <anyName/>
    <text/>
   </attribute>
  </zeroOrMore>
 </element>
</define>

</grammar>
