<!-- ========================================================================
     TerseAnonymousData DTD:
     
     Author: John Tigue <jtigue@datachannel.com>
     Date: 1998.3.19

     Copyright (c) 1998 DataChannel Inc. http://www.datachannel.com
     -->

<!-- ========================================================================
     History:

     Release 1998.3.19  (John Tigue)
         first relatively clean pass

     Release 1998.3.21 (JFT)     
         more clean up

     Release 1998.3.26 (JFT)
         changes "s" attribute to "l" to more close reflect array terminology
         two or three little bugs fixed

     Release 1998.3.31 (JFT) 
         1998.3.31: 
             satisfied XML processor
      Release NEXT
	     1998.4.5: added primitive data type entities
    -->


<!-- ========================================================================
     Introductory Note:

     This is a terse analog of the AnonymousData DTD. Element type names and 
     attribute names have been reduced to single characters for the sake of
     network and XML processor efficiency.

     See the AnonymousData DTD for a full explanation:
          http://xml.datachannel.com/system/dtd/AnonymousData.dtd

     The map between the terse and loquacious element names is:
      
           TerseAnonymousData    AnonymousData
           ==================    =============
                            z    data
                            b    boolean
                            B    booleanArray
                            c    char
                            C    charArray
                            d    double 
                            D    doubleArray            
                            i    int
                            I    intArray
                            l    long  
                            L    longArray  
                            f    float  
                            F    floatArray 
                            h    short  
                            H    shortArray  
                            y    byte 
                            Y    byteArray  
                            s    string
                            S    stringArray 
                            u    URI
                            U    URIArray
    
     In general, a primitive type and an array of the same are represented by 
     a lower case character and an uppercase character, respectively, and the
     character selected is the first character of the analog element in
     AnonymousData (the exceptions being "short" and "byte" because they
     conflice with "boolean" and "string").

     Note that a maximally terse yet still XML 1.0 document could omit the 
     XML TextDeclaration which occurs at the head of the document i.e. the
     following is not require by XML 1.0:
          <?xml version="1.0" encode="UTF-8"> 
     
     Also, the DocumentTypeDefinition can be omitted i.e.:
          <!DOCTYPE d PUBLIC
                    "-//DataChannel//TerseAnonymousData V1.0//EN"
                    "http://xml.datachannel.com/TerseAnonymousData.dtd" >
   
     The following is an example of a terse document which contains a
     sequence of typed data. In particular, it contains an interger array of
     length 3, a string, a null string, and a char array of length 2:

     <z><I l="2"><i>893</i><i>-5</i></I><s>hi</s><s/><C l="2">xy</C></z>

     It is not expected that humans would be creating or reading these
     documents but if so they would use the non-terse analogue of these
     declarations.
     
     These declarations can be referred to as an external entity using 
     either a public ID:
     
          <!DOCTYPE z 
                    PUBLIC
                    "-//DataChannel//DTD TerseAnonymousData V1.0//EN"
                    "http://xml.datachannel.com/TerseAnonymousData.dtd"
                    >

     or using a system id such as:
     
          <!DOCTYPE z 
                    SYSTEM
                    "http://xml.datachannel.com//TerseAnonymousData.dtd"
                    >
     
     Thanks to Eve Maler and W. Eliot Kimber for their help.
     -->

<?namespace name="urn:uuid:C2F41010-65B3-11d1-A29F-00AA00C14882/" as="dt"?>

<!ENTITY % primitiveDataTypeEntities SYSTEM "PrimitiveDataTypes.dtd" >
%primitiveDataTypeEntities;

<!ENTITY % dataTypes "b|B|c|C|d|D|i|I|l|L|f|F|h|H|y|Y|s|S|u|U" >



<!-- Terse element name: z 
     Loquacious analog: data
     -->
<!ELEMENT z ( (%dataTypes;)* )>


<!-- Terse element name: b 
     Loquacious analog: boolean
     -->
<!ELEMENT b EMPTY>

<!-- Terse attribute name: v 
     Loquacious analog: value ("t" maps to "true" and "f" maps to "false"
     -->
<!ATTLIST b 
          v (t|f) #REQUIRED
          dt:dt CDATA #FIXED "boolean"
          >

<!-- Terse element name: B 
     Loquacious analog: booleanArray
     -->
<!ELEMENT B (b*)>

<!-- Terse attribute name: l 
     Loquacious analog: length
     -->
<!ATTLIST B 
          l CDATA #REQUIRED
          dt:dt CDATA #FIXED "boolean"
          >


<!-- Terse element name: c 
     Loquacious analog: char
     -->
<!ELEMENT c (#PCDATA)> 
<!ATTLIST c
          dt:dt CDATA #FIXED "char"
          >

<!-- Terse element name: C 
     Loquacious analog: charArray
     -->
<!ELEMENT C (#PCDATA)>

<!-- Terse attribute name: l 
     Loquacious analog: length
     -->
<!ATTLIST C 
          l CDATA #REQUIRED
          dt:dt CDATA #FIXED "char"
          >

<!-- Terse element name: s 
     Loquacious analog: string
     -->
<!ELEMENT s (#PCDATA)> 
<!ATTLIST s
          dt:dt CDATA #FIXED "string"
          >

<!-- Terse element name: S 
     Loquacious analog: stringArray
     -->
<!ELEMENT S (s*)>       

<!-- Terse attribute name: l 
     Loquacious analog: length
     -->
<!ATTLIST S 
          l CDATA #REQUIRED
          dt:dt CDATA #FIXED "string"
          >

<!-- Terse element name: u 
     Loquacious analog: URI
     -->
<!ELEMENT u (#PCDATA)>               
<!ATTLIST u
          dt:dt CDATA #FIXED "URI"
          >

<!-- Terse element name: U 
     Loquacious analog: URIArray
     -->
<!ELEMENT U (u*)>

<!-- Terse attribute name: l 
     Loquacious analog: length
     -->
<!ATTLIST U
          l CDATA #REQUIRED
          dt:dt CDATA #FIXED "URI"
          >

<!-- Terse element name: y 
     Loquacious analog: byte
     -->
<!ELEMENT y (#PCDATA)>  
<!ATTLIST y
          dt:dt CDATA #FIXED "bin.hex"
          >

<!-- Terse element name: Y 
     Loquacious analog: byteArray
     -->
<!ELEMENT Y (#PCDATA)>         

<!-- Terse attribute name: l 
     Loquacious analog: length
     -->
<!ATTLIST Y 
          l CDATA #REQUIRED
          dt:dt CDATA #FIXED "bin.hex"
          >


<!-- Terse element name: h 
     Loquacious analog: short
     -->
<!ELEMENT h (#PCDATA)>
<!ATTLIST h
          dt:dt CDATA #FIXED "i2"
          >

<!-- Terse element name: H
     Loquacious analog: shortArray
     -->
<!ELEMENT H (h*)>             

<!-- Terse attribute name: l 
     Loquacious analog: length
     -->
<!ATTLIST H 
          l CDATA #REQUIRED
          dt:dt CDATA #FIXED "i2"
          >

<!-- Terse element name: i 
     Loquacious analog: int
     -->
<!ELEMENT i (#PCDATA)>  
<!ATTLIST i 
          dt:dt CDATA #FIXED "int"
          >

<!-- Terse element name: I 
     Loquacious analog: intArray
     -->
<!ELEMENT I (i*)>       

<!-- Terse attribute name: l 
     Loquacious analog: length
     -->
<!ATTLIST I 
          l CDATA #REQUIRED
          dt:dt CDATA #FIXED "int"
          >


<!-- Terse element name: l 
     Loquacious analog: long
     -->
<!ELEMENT l (#PCDATA)> 
<!ATTLIST l
          dt:dt CDATA #FIXED "i8"
          >

<!-- Terse element name: L 
     Loquacious analog: longArray
     -->
<!ELEMENT L (l*)>             

<!-- Terse attribute name: l 
     Loquacious analog: length
     -->
<!ATTLIST L 
          l CDATA #REQUIRED
          dt:dt CDATA #FIXED "i8"
          >


<!-- Terse element name: f 
     Loquacious analog: float
     -->
<!ELEMENT f (#PCDATA)>  
<!ATTLIST f
          dt:dt CDATA #FIXED "float.IEEE.754.32"
          >

<!-- Terse element name: F 
     Loquacious analog: floatArray
     -->
<!ELEMENT F (f*)>           

<!-- Terse attribute name: l 
     Loquacious analog: length
     -->
<!ATTLIST F 
          l CDATA #REQUIRED
          dt:dt CDATA #FIXED "float.IEEE.754.32"
          >

<!-- Terse element name: d 
     Loquacious analog: double
     -->
<!ELEMENT d (#PCDATA)> 
<!ATTLIST d
          dt:dt CDATA #FIXED "float.IEEE.754.64"
          >

<!-- Terse element name: D 
     Loquacious analog: doubleArray
     -->
<!ELEMENT D (d*)>           

<!-- Terse attribute name: l 
     Loquacious analog: length
     -->
<!ATTLIST D 
          l CDATA #REQUIRED
          dt:dt CDATA #FIXED "float.IEEE.754.64"
          >

