<!-- the 'count' attribute indicates how many times it appears in its 
     parent container. either:
          1 (once always),
          opt (optionally once), 
          1more (1 or more times), 
          0more (0 or more times)                                  -->
<!ENTITY % countatt "count (1|opt|1more|0more) '1'">

<!-- presence of keys are either there or optionally there, 
     can't be more than 1:                                         -->
<!ENTITY % keycountatt "count (1|opt) '1'">

<!ELEMENT ljxmlrpc (method*)>

<!ELEMENT method  (shortdes?, des?, arguments, returns, expost, exreturn)>
<!ATTLIST method  name NMTOKEN #REQUIRED>

<!-- arguments and return both have a list of values, either structs, lists, or scalars -->
<!ELEMENT arguments (struct | list | scalar)*>
<!ELEMENT returns   (struct | list | scalar)*>

<!ELEMENT scalar (des?)>
<!ATTLIST scalar %countatt;>

<!ELEMENT struct (key*)>
<!ATTLIST struct %countatt;>

<!ELEMENT key (des?, (scalar | struct | list))>
<!ATTLIST key name NMTOKEN #REQUIRED %keycountatt;>

<!ELEMENT list (des?, (struct | list | scalar)*)>
<!ATTLIST list %countatt;>

<!ELEMENT shortdes (#PCDATA)>
<!ELEMENT des (#PCDATA|link)*>

<!ELEMENT link (#PCDATA)>
<!ATTLIST link id NMTOKEN #REQUIRED>

<!ELEMENT expost (#PCDATA)>
<!ELEMENT exreturn (#PCDATA)>