<?xml version="1.0" encoding="UTF-8"?>
<!-- http://www.xml.com/lpt/a/2002/01/23/relaxng.html -->
<!-- http://www.oasis-open.org/committees/relax-ng/tutorial-20011203.html -->
<!-- http://www.zvon.org/xxl/XMLSchemaTutorial/Output/ser_wildcards_st8.html -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
        xmlns:ds='http://www.w3.org/2000/09/xmldsig#'
        ns="http://www.w3.org/2001/04/xmlenc#"
        datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">

    <start>
        <choice>
            <ref name="EncryptedData"/>
            <ref name="EncryptedKey"/>
        </choice>
    </start>   
  
    <define name="EncryptedData">
        <element name="EncryptedData">
          <ref name="EncryptedType"/>
        </element>
    </define>
  
  
    <define name="EncryptedKey">
        <element name="EncryptedKey">
            <ref name="EncryptedType"/>
            <optional><ref name="ReferenceList"/></optional>
            <optional><element name='CarriedKeyName'><data type="string"/></element></optional>
            <optional><attribute name='Recipient'> <data type="string"/></attribute></optional>
        </element>
    </define>

    
     <define name="EncryptedType">
        <ref name="EncryptionMethod"/>
        <optional>
            <element name="ds:KeyInfo">
              <zeroOrMore>
                    <element>
                        <anyName/>
                        <text/>
                        <zeroOrMore>
                            <attribute>
                                <anyName/>
                            </attribute>
                        </zeroOrMore>
                    </element>
                </zeroOrMore>
            </element>
        </optional>
        <optional>
            <ref name="CipherData"/>
        </optional> 
        <optional>
            <ref name="EncryptionProperties"/>
        </optional>

        <optional>
            <attribute name="Id">
                <data type="ID"/>
            </attribute>
        </optional>
        <optional>
            <attribute name="Type">
                <data type="anyURI"/>
            </attribute>
        </optional>
        <optional>
           <attribute name="MimeType">
                <data type="string"/>
            </attribute>
        </optional>
        <optional>
            <attribute name="Encoding">
                <data type="anyURI"/>
            </attribute>
        </optional>
    </define> 

    <define name="EncryptionMethod">
        <element name="EncryptionMethod">
            <text/>
            <attribute name="Algorithm">
                <data type="anyURI"/>
            </attribute>
        </element>
    </define>

    <define name="ReferenceList">
        <element name="ReferenceList">
            <text/>
        </element>
    </define>
    
    <define name="CipherData">
        <element name="CipherData">
        <choice>
            <element name="CipherValue"><text/></element>
            
            <element name="CipherReference">
                <element name="Transforms">
                  <zeroOrMore>
                        <element>
                            <nsName ns="http://www.w3.org/2000/09/xmldsig#"/>
                            <text/>
                            <zeroOrMore>
                                <attribute>
                                    <anyName/>
                                </attribute>
                            </zeroOrMore>
                        </element>
                    </zeroOrMore>
                </element>
                <attribute name="URI">
                    <data type="anyURI"/>
                </attribute>      
            </element>
            
        </choice>
        </element>
    </define>
    
    <define name="EncryptionProperties">
        <element name="EncryptionProperties">
        
            <element name="EncryptionProperty">
              <zeroOrMore>
                    <element>
                        <anyName/>
                        <text/>
                    </element>
                </zeroOrMore>
                <attribute name="Target">
                    <data type="anyURI"/>
                </attribute>          
                <attribute name="Id">
                    <data type="ID"/>
                </attribute>    
            </element>
            
            <attribute name="Id">
                <data type="ID"/>
            </attribute>    
        </element>
    </define>

</grammar>