<!--
    furniture.dtd
    
    A vocabulary for describing furniture.
-->
<!ELEMENT furniture_item (desc, %extra_tags; user_tags?, parts_list, assembly+)>

<!ATTLIST furniture_item
    xmlns CDATA #FIXED "http://namespaces.oreilly.com/furniture/"
>

<!ELEMENT p (#PCDATA)>

<!ELEMENT desc (#PCDATA | p)*>
<!ATTLIST desc
    xml:lang NMTOKEN 'en'
    xml:space (default|preserve) 'preserve'
>

<!ELEMENT user_tags ANY>

<!ELEMENT parts_list (part_name+)>

<!ELEMENT part_name (#PCDATA)>
<!ATTLIST part_name
    id ID #REQUIRED
    count CDATA "1"
>

<!ELEMENT assembly (fastener*, (assembly | part), (assembly | part)+)>
<!ATTLIST assembly
    id ID #IMPLIED
    repeat CDATA "1"
>

<!ELEMENT fastener EMPTY>
<!ATTLIST fastener
    part_num IDREF #REQUIRED
    count CDATA "1"
>

<!ELEMENT part EMPTY>
<!ATTLIST part
    part_num IDREF #REQUIRED
    count CDATA "1"
>

<!ENTITY % private 'IGNORE'>
<!ENTITY % public 'INCLUDE'>

<![ %private; [
  <!ENTITY cright_notice "&#xa9; 2000 Furniture Makers. DO NOT DISTRIBUTE">
]]>

<![ %public; [
 <!ENTITY cright_notice "&#xa9; 2000 Furniture Makers.">
]]>
