<!-- 
   This DTD has been developed in order to validate XSL FO documents 
   conformant to XSL Recommendation of October 15, 2001. The namespace 
   prefix is 
   
     xmlns:fo="http://www.w3.org/1999/XSL/Format".

   This DTD also makes provision for few extensions to XSL Rec, put 
   into a separate namespace: 

     xmlns:rx="http://www.renderx.com/XSL/Extensions".

   Please e-mail your comments to Nikolai Grigoriev <grig@renderx.com>

   © RenderX, 1999-2002. 

-->


<!-- *******************************************************************

This DTD was written in mind to validate testcases for the new XSL FO 
draft. Therefore, it is restrictive with respect to the spec: some rare 
XSL FO features have been dropped in order to validate others more 
reliably. Unless a document intentionally uses some of the functionality 
listed below in the introductory notes, it shall be conformant to this 
DTD in order to be a valid XSL FO document. 

INTRODUCTORY NOTES

1. XSL FO are hard to validate by a DTD: attributes are universally 
inheritable due to the adoption of the 'inherit' value from CSS2; and 
even for the content model, presence of universal wrappers like fo:wrapper 
makes it impossible to trace a neat distinction between inline-level and 
block-level content. Therefore, this version of the DTD cannot reliably
detect inconsistencies in attribute sets: real checks are performed 
only for empty inline elements and top-level elements (fo:layout-master-set 
and its descendants). 

2. The contents of the fo:instream-foreign-object element is hardvired to
be an SVG graphic. To validate it, this DTD includes an SVG DTD as an 
external entity.

DEVIATIONS FROM THE DRAFT

1. Content model for <fo:layout-master-set> is made more strict:
at least one fo:simple-page-master should be present. (I think this 
is more like a correction to the spec, rather than a deviation from it).

2. In XSL 1.0, page and region-body margins may be expressed in terms
of space-*. This does not make any sense, as far as no stacked 
constraint may occur. For this reason, I have disabled spaces
in this context, leaving only plain old CSS margins.

3. Attributes of elements inside fo:layout-master-set may have a value 
of 'inherit'. However, I have disabled the occurrence of such attributes
on parent elements: inheriting them buys us little in terms of 
conciseness, but is error-prone in the initial phase.

4. Table-omit-{header|footer}-at-break is added a value of 'inherit',
to align it with the rest of table attributes. (If table-layout may have
it, why these two should not?)

5. Text-align has a closed list of values, neglecting the <string> value
type. The reason is practical: many stylesheet writers are used to write 
"centered" and "justified", whereas the correct values for this version 
of the draft are "center" and "justify"; catching this error in the DTD
turned out to be useful. Moreover, <string> values are poorly described 
in the draft (nothing but a reference to CSS2), and are unlikely to be 
implemented soon. (Ultimate reason: changing the attribute value back to 
CDATA is a matter of few seconds ;-)).

6. Only basic values for writing-mode are included. 

7. "Reference-orientation" is given <angle> values, besides numeric
   ones described in the Recommendation. 

8. Several extension elements and properties are added to enable 
functionality missing from the Recommendation:

rx:background-content-height (attribute)
rx:background-content-width (attribute)
rx:background-content-type (attribute)
rx:background-scaling (attribute)

   These properties are exact analogs of 'content-height', 'content-width'
   'content-type', and 'scaling' but apply to the background image.

rx:outline (element)
rx:bookmark (element)
rx:bookmark-label (element)

   These elements implement PDF bookmarks.

rx:meta-info (element)
rx:meta-field (element)

   These elements pass meta-information about the document.

rx:page-device (element) 

   This element permits passing parameters to setpagedevice
   operator in PostScript

rx:flow-section (element) 

   This element permits setting arbitrary number of columns
   in a sigle page.

rx:key (attribute)
rx:page-index (element)

   These elements implement page number lists in indexes.


******************************************************************** -->

<!-- *************************************************************** -->
<!-- Include external DTDs for foreign objects                       -->
<!-- *************************************************************** -->

<!-- Commented out for evaluation version 

<!ENTITY % instream-foreign-object-dtd SYSTEM "instream-foreign-object.dtd">

%instream-foreign-object-dtd; 

-->

<!-- *************************************************************** -->
<!-- Entity definitions for groups of formatting objects             -->
<!-- *************************************************************** -->

<!ENTITY % basic-inlines "
    fo:bidi-override
  | fo:character
  | fo:external-graphic
  | fo:instream-foreign-object  
  | fo:inline
  | fo:inline-container
  | fo:leader
  | fo:page-number
  | fo:page-number-citation
  | fo:basic-link
  | fo:multi-toggle
  | rx:pinpoint
  | rx:page-index
">

<!ENTITY % basic-blocks "
    fo:block
  | fo:block-container
  | fo:table-and-caption
  | fo:table
  | fo:list-block
">

<!ENTITY % out-of-lines "
    fo:footnote
  | fo:float
">

<!ENTITY % wrappers "
    fo:multi-switch
  | fo:multi-properties
  | fo:wrapper 
  | fo:marker
  | fo:retrieve-marker
">

<!ENTITY % inlines " 
    #PCDATA 
  | %basic-inlines; 
  | %out-of-lines; 
  | %wrappers;
">

<!ENTITY % blocks " 
    %basic-blocks; 
  | %out-of-lines; 
  | %wrappers;
">

<!ENTITY % mixed-level " 
    #PCDATA 
  | %basic-inlines; 
  | %basic-blocks; 
  | %out-of-lines; 
  | %wrappers;
">


<!-- *************************************************************** -->
<!-- Entity definitions for common groups of properties              -->
<!-- This grouping reflects properties cooccurrence, rather than     -->
<!-- property semantics. It does not correspond to grouping in the   -->
<!-- draft.                                                          -->
<!-- *************************************************************** -->

<!-- Accessibility Properties                                        -->
<!ENTITY % accessibility-properties "
  source-document  CDATA  #IMPLIED
  role  CDATA  #IMPLIED
">

<!-- Relative Position Properties                                    -->
<!-- 'position' shorthand property also makes part of this group     -->
<!ENTITY % relative-position-properties "
  relative-position  ( auto | static | relative | inherit )  #IMPLIED
  position  ( static | relative | absolute | fixed | inherit)  #IMPLIED
  top  CDATA  #IMPLIED
  right  CDATA  #IMPLIED
  bottom  CDATA  #IMPLIED
  left  CDATA  #IMPLIED
">

<!-- Absolute or Relative Position Properties                       -->
<!-- There is no object that can be positioned only absolutely.     -->
<!-- Therefore, absolute and relative positioning properties are    -->
<!-- grouped together                                               -->
<!ENTITY % absolute-or-relative-position-properties "
  absolute-position  ( auto | absolute | fixed | inherit )  #IMPLIED
  %relative-position-properties;
">


<!-- Aural Properties                                                -->
<!-- 'cue' and 'pause' shorthand properties are also included        -->
<!ENTITY % aural-properties "
  azimuth  CDATA  #IMPLIED
  cue  CDATA  #IMPLIED
  cue-after  CDATA  #IMPLIED
  cue-before  CDATA  #IMPLIED
  elevation  CDATA  #IMPLIED
  pause  CDATA  #IMPLIED
  pause-after  CDATA  #IMPLIED
  pause-before  CDATA  #IMPLIED
  pitch  CDATA  #IMPLIED
  pitch-range  CDATA  #IMPLIED
  play-during  CDATA  #IMPLIED
  richness  CDATA  #IMPLIED
  speak  ( normal | none | spell-out | inherit )  #IMPLIED
  speak-header  ( once | always | inherit ) #IMPLIED
  speak-numeral  ( digits | continuous | inherit )  #IMPLIED
  speak-punctuation  ( code | none | inherit )  #IMPLIED
  speech-rate  CDATA  #IMPLIED
  stress  CDATA  #IMPLIED
  voice-family  CDATA  #IMPLIED
  volume  CDATA  #IMPLIED
">


<!-- Common Border, Padding, and Background Properties               -->
<!-- Relative shorthand properties are also included                 -->
<!ENTITY % border-padding-background-properties "
  background  CDATA  #IMPLIED
  background-attachment  ( scroll | fixed | inherit )  #IMPLIED
  background-color  CDATA  #IMPLIED
  background-image  CDATA  #IMPLIED
  background-position  CDATA  #IMPLIED
  background-position-vertical  CDATA  #IMPLIED
  background-position-horizontal  CDATA  #IMPLIED
  background-repeat  ( repeat | repeat-x | repeat-y 
                     | no-repeat | inherit ) #IMPLIED
  rx:background-content-type  CDATA  #IMPLIED
  rx:background-content-height  CDATA  #IMPLIED
  rx:background-content-width  CDATA  #IMPLIED
  rx:background-scaling  ( uniform | non-uniform)  #IMPLIED
  border  CDATA  #IMPLIED
  border-after-color  CDATA  #IMPLIED
  border-after-style  ( none | hidden | dotted | dashed 
                      | solid | double | groove | ridge 
                      | inset | outset | inherit )  #IMPLIED
  border-after-width  CDATA  #IMPLIED
  border-after-width.length  CDATA  #IMPLIED
  border-after-width.conditionality ( discard | retain)  #IMPLIED
  border-before-color  CDATA  #IMPLIED
  border-before-style  ( none | hidden | dotted | dashed 
                       | solid | double | groove | ridge 
                       | inset | outset | inherit )   #IMPLIED
  border-before-width  CDATA  #IMPLIED
  border-before-width.length  CDATA  #IMPLIED
  border-before-width.conditionality ( discard | retain)  #IMPLIED
  border-bottom  CDATA  #IMPLIED
  border-bottom-color  CDATA  #IMPLIED
  border-bottom-style  ( none | hidden | dotted | dashed 
                       | solid | double | groove | ridge 
                       | inset | outset | inherit )   #IMPLIED
  border-bottom-width  CDATA  #IMPLIED
  border-bottom-width.length  CDATA  #IMPLIED
  border-bottom-width.conditionality ( discard | retain)  #IMPLIED
  border-color  CDATA  #IMPLIED
  border-end-color  CDATA  #IMPLIED
  border-end-style  ( none | hidden | dotted | dashed 
                    | solid | double | groove | ridge 
                    | inset | outset | inherit )   #IMPLIED
  border-end-width  CDATA  #IMPLIED
  border-end-width.length  CDATA  #IMPLIED
  border-end-width.conditionality ( discard | retain)  #IMPLIED
  border-left  CDATA  #IMPLIED
  border-left-color  CDATA  #IMPLIED
  border-left-style  ( none | hidden | dotted | dashed 
                     | solid | double | groove | ridge 
                     | inset | outset | inherit )   #IMPLIED
  border-left-width  CDATA  #IMPLIED
  border-left-width.length  CDATA  #IMPLIED
  border-left-width.conditionality ( discard | retain)  #IMPLIED
  border-right  CDATA  #IMPLIED
  border-right-color  CDATA  #IMPLIED
  border-right-style  ( none | hidden | dotted | dashed 
                      | solid | double | groove | ridge 
                      | inset | outset | inherit )   #IMPLIED
  border-right-width  CDATA  #IMPLIED
  border-right-width.length  CDATA  #IMPLIED
  border-right-width.conditionality ( discard | retain)  #IMPLIED
  border-start-color  CDATA  #IMPLIED
  border-start-style  ( none | hidden | dotted | dashed 
                      | solid | double | groove | ridge 
                      | inset | outset | inherit )   #IMPLIED
  border-start-width  CDATA  #IMPLIED
  border-start-width.length  CDATA  #IMPLIED
  border-start-width.conditionality ( discard | retain)  #IMPLIED
  border-style CDATA #IMPLIED
  border-top  CDATA  #IMPLIED
  border-top-color  CDATA  #IMPLIED
  border-top-style  ( none | hidden | dotted | dashed 
                    | solid | double | groove | ridge 
                    | inset | outset | inherit )   #IMPLIED
  border-top-width  CDATA  #IMPLIED
  border-top-width.length  CDATA  #IMPLIED
  border-top-width.conditionality ( discard | retain)  #IMPLIED
  border-width  CDATA  #IMPLIED
  padding  CDATA  #IMPLIED
  padding-after  CDATA  #IMPLIED
  padding-after.length  CDATA  #IMPLIED
  padding-after.conditionality ( discard | retain)  #IMPLIED
  padding-before  CDATA  #IMPLIED
  padding-before.length  CDATA  #IMPLIED
  padding-before.conditionality ( discard | retain)  #IMPLIED
  padding-bottom  CDATA  #IMPLIED
  padding-bottom.length  CDATA  #IMPLIED
  padding-bottom.conditionality ( discard | retain)  #IMPLIED
  padding-end  CDATA  #IMPLIED
  padding-end.length  CDATA  #IMPLIED
  padding-end.conditionality ( discard | retain)  #IMPLIED
  padding-left  CDATA  #IMPLIED
  padding-left.length  CDATA  #IMPLIED
  padding-left.conditionality ( discard | retain)  #IMPLIED
  padding-right  CDATA  #IMPLIED
  padding-right.length  CDATA  #IMPLIED
  padding-right.conditionality ( discard | retain)  #IMPLIED
  padding-start  CDATA  #IMPLIED
  padding-start.length  CDATA  #IMPLIED
  padding-start.conditionality ( discard | retain)  #IMPLIED
  padding-top  CDATA  #IMPLIED
  padding-top.length  CDATA  #IMPLIED
  padding-top.conditionality ( discard | retain)  #IMPLIED
">

<!-- Border Precedence Properties for tables                         -->
<!ENTITY % border-precedence-properties "
  border-after-precedence  CDATA  #IMPLIED
  border-before-precedence  CDATA  #IMPLIED
  border-end-precedence  CDATA  #IMPLIED
  border-start-precedence  CDATA  #IMPLIED
">

<!-- Box Size Properties                                             -->
<!ENTITY % box-size-properties "
  height  CDATA  #IMPLIED
  min-height  CDATA  #IMPLIED
  max-height  CDATA  #IMPLIED
  width  CDATA  #IMPLIED
  min-width  CDATA  #IMPLIED
  max-width  CDATA  #IMPLIED
  inline-progression-dimension  CDATA  #IMPLIED
  inline-progression-dimension.minimum  CDATA  #IMPLIED
  inline-progression-dimension.optimum  CDATA  #IMPLIED
  inline-progression-dimension.maximum  CDATA  #IMPLIED
  block-progression-dimension  CDATA  #IMPLIED
  block-progression-dimension.minimum  CDATA  #IMPLIED
  block-progression-dimension.optimum  CDATA  #IMPLIED
  block-progression-dimension.maximum  CDATA  #IMPLIED
">

<!-- Common Area Properties                                          -->
<!ENTITY % area-properties "
  clip  CDATA  #IMPLIED
  overflow  ( visible | hidden | scroll | auto 
            | error-if-overflow | inherit )  #IMPLIED
  display-align  ( auto | before | center | after | inherit )  #IMPLIED
  reference-orientation  ( 0 | 90 | 180 | 270 | -90 | -180 | -270  
                         | 0deg  | 90deg   | 180deg  | 270deg 
                         | -90deg | -180deg | -270deg | inherit )  #IMPLIED
  writing-mode  ( lr-tb | rl-tb | tb-rl | lr | rl | tb | inherit ) #IMPLIED
">


<!-- Common Font Properties                                          -->
<!-- 'font' shorthand property is also included                      -->
<!ENTITY % font-properties "
  font  CDATA  #IMPLIED
  font-selection-strategy  (auto | character-by-character | inherit)   #IMPLIED
  font-family  CDATA  #IMPLIED
  font-size  CDATA  #IMPLIED
  font-size-adjust  CDATA  #IMPLIED
  font-stretch  (normal | wider | narrower 
               | ultra-condensed | extra-condensed | condensed
               | semi-condensed | semi-expanded | expanded 
               | extra-expanded | ultra-expanded | inherit) #IMPLIED
  font-style  ( normal | italic | oblique | backslant | inherit)  #IMPLIED
  font-variant  ( normal | small-caps | inherit )  #IMPLIED
  font-weight  (normal | bold | bolder | lighter | inherit 
              | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900) #IMPLIED
">

<!-- Common Hyphenation Properties - Inline                          -->
<!-- 'xml:lang' shorthand property is also included                  -->
<!ENTITY % hyphenation-properties-inline "
  country  CDATA  #IMPLIED
  language  CDATA  #IMPLIED
  script  CDATA  #IMPLIED
  xml:lang  CDATA  #IMPLIED
  hyphenate  ( false | true | inherit )  #IMPLIED
  hyphenation-character  CDATA  #IMPLIED
  hyphenation-push-character-count  CDATA  #IMPLIED
  hyphenation-remain-character-count  CDATA  #IMPLIED
">

<!-- Common Hyphenation Properties - Block                           -->

<!ENTITY % hyphenation-properties-block "
  hyphenation-keep  ( auto | column | page | inherit )  #IMPLIED
  hyphenation-ladder-count  CDATA  #IMPLIED
  %hyphenation-properties-inline;
">


<!-- Common CSS Margin Properties                                    -->
<!-- 'margin' shorthand property is also included                    -->
<!ENTITY % margin-properties-CSS "
  margin  CDATA  #IMPLIED
  margin-bottom  CDATA  #IMPLIED
  margin-left  CDATA  #IMPLIED
  margin-right  CDATA  #IMPLIED
  margin-top  CDATA  #IMPLIED
">

<!-- Common Margin Properties - Block                                -->
<!ENTITY % margin-properties-block "
  %margin-properties-CSS;
  space-after  CDATA  #IMPLIED
  space-after.minimum  CDATA  #IMPLIED
  space-after.optimum  CDATA  #IMPLIED
  space-after.maximum  CDATA  #IMPLIED
  space-after.precedence  CDATA  #IMPLIED
  space-after.conditionality  ( retain | discard )  #IMPLIED
  space-before  CDATA  #IMPLIED
  space-before.minimum  CDATA  #IMPLIED
  space-before.optimum  CDATA  #IMPLIED
  space-before.maximum  CDATA  #IMPLIED
  space-before.precedence  CDATA  #IMPLIED
  space-before.conditionality  ( retain | discard )  #IMPLIED
  start-indent  CDATA  #IMPLIED
  end-indent  CDATA  #IMPLIED
">

<!-- Common Margin Properties - Inline                               -->
<!ENTITY % margin-properties-inline "
  %margin-properties-block;
  space-start  CDATA  #IMPLIED
  space-start.minimum  CDATA  #IMPLIED
  space-start.optimum  CDATA  #IMPLIED
  space-start.maximum  CDATA  #IMPLIED
  space-start.precedence  CDATA  #IMPLIED
  space-start.conditionality  ( retain | discard )  #IMPLIED
  space-end  CDATA  #IMPLIED
  space-end.minimum  CDATA  #IMPLIED
  space-end.optimum  CDATA  #IMPLIED
  space-end.maximum  CDATA  #IMPLIED
  space-end.precedence  CDATA  #IMPLIED
  space-end.conditionality  ( retain | discard )  #IMPLIED
">

<!-- Area Alignment Properties - inline                              -->
<!-- 'vertical-align' shorthand is added                             -->                          
<!ENTITY % area-alignment-properties-inline "
  alignment-adjust  CDATA  #IMPLIED
  alignment-baseline  ( auto | baseline | before-edge | text-before-edge 
                       | middle | central | after-edge | text-after-edge 
                       | top | text-top | bottom | text-bottom
                       | ideographic | alphabetic | hanging 
                       | mathematical | inherit )  #IMPLIED
  baseline-shift  CDATA  #IMPLIED
  dominant-baseline  ( auto | use-script | no-change 
                     | reset-size | ideographic | alphabetic 
                     | hanging | mathematical | central | middle 
                     | text-after-edge | text-before-edge |inherit )  #IMPLIED
  vertical-align  CDATA  #IMPLIED
">

<!-- Line Height Properties                                         -->

<!ENTITY % line-height-properties "
  line-height  CDATA  #IMPLIED
  line-height.minimum  CDATA  #IMPLIED
  line-height.optimum  CDATA  #IMPLIED
  line-height.maximum  CDATA  #IMPLIED
  line-height.precedence  CDATA  #IMPLIED
  line-height.conditionality  ( retain | discard )  #IMPLIED
  line-height-shift-adjustment  CDATA  #IMPLIED
">

<!-- Line Related Properties                                         -->
<!-- [!] <string> values are temporarily excluded from text-align    -->

<!ENTITY % line-related-properties "
  text-align  ( start | center | end | justify 
              | inside | outside | left | right | inherit )  #IMPLIED
  text-align-last  ( relative | start | center | end | justify 
                   | inside | outside | left | right | inherit )  #IMPLIED
  text-indent  CDATA  #IMPLIED
  last-line-end-indent  CDATA  #IMPLIED
  line-stacking-strategy  ( line-height | font-height 
                          | max-height | inherit )  #IMPLIED
  linefeed-treatment  ( ignore | preserve | treat-as-space 
                      | treat-as-zero-width-space | inherit )  #IMPLIED
  white-space  ( normal | pre | nowrap | inherit )  #IMPLIED
  white-space-treatment  ( ignore | preserve  
                         | ignore-if-before-linefeed | ignore-if-after-linefeed 
                         | ignore-if-surrounding-linefeed | inherit )  #IMPLIED
  white-space-collapse  ( false | true | inherit )  #IMPLIED
  wrap-option  ( no-wrap | wrap | inherit )  #IMPLIED
  unicode-bidi  ( normal | embed | bidi-override | inherit )  #IMPLIED
  direction  ( ltr | rtl | inherit )  #IMPLIED
">


<!-- Character Properties                                            -->

<!ENTITY % character-properties "
  letter-spacing  CDATA  #IMPLIED
  letter-spacing.minimum  CDATA  #IMPLIED
  letter-spacing.optimum  CDATA  #IMPLIED
  letter-spacing.maximum  CDATA  #IMPLIED
  letter-spacing.precedence  CDATA  #IMPLIED
  letter-spacing.conditionality  ( retain | discard )  #IMPLIED
  word-spacing  CDATA  #IMPLIED
  word-spacing.minimum  CDATA  #IMPLIED
  word-spacing.optimum  CDATA  #IMPLIED
  word-spacing.maximum  CDATA  #IMPLIED
  word-spacing.precedence  CDATA  #IMPLIED
  word-spacing.conditionality  ( retain | discard )  #IMPLIED
  treat-as-word-space  ( auto | true | false | inherit )  #IMPLIED
  text-decoration  NMTOKENS  #IMPLIED
  score-spaces  ( true | false | inherit )  #IMPLIED
  text-shadow  CDATA  #IMPLIED
  text-transform  ( capitalize | uppercase | lowercase 
                  | none | inherit )  #IMPLIED
  suppress-at-line-break  ( auto | suppress | retain | inherit )  #IMPLIED
  text-altitude  CDATA  #IMPLIED
  text-depth  CDATA  #IMPLIED
  glyph-orientation-horizontal ( 0 | 90 | 180 | 270 | -90 | -180 | -270  
                             | 0deg  | 90deg   | 180deg  | 270deg 
                             |-90deg | -180deg | -270deg | inherit )  #IMPLIED
  glyph-orientation-vertical ( 0 | 90 | 180 | 270 | -90 | -180 | -270  
                             | 0deg  | 90deg   | 180deg  | 270deg 
                             |-90deg | -180deg | -270deg | inherit )  #IMPLIED
  %font-properties;
  %line-height-properties;
">


<!-- Common Keeps and Breaks Properties - Atomic objects             -->
<!-- 'page-break-*' shorthand properties are also included           -->
<!ENTITY % keeps-and-breaks-properties-atomic "
  break-after  ( auto | column | page 
               | even-page | odd-page | inherit )  #IMPLIED
  break-before  ( auto | column | page 
                | even-page | odd-page | inherit )  #IMPLIED
  keep-with-next  CDATA  #IMPLIED
  keep-with-next.within-line  CDATA  #IMPLIED
  keep-with-next.within-column  CDATA  #IMPLIED
  keep-with-next.within-page  CDATA  #IMPLIED
  keep-with-previous  CDATA  #IMPLIED
  keep-with-previous.within-line  CDATA  #IMPLIED
  keep-with-previous.within-column  CDATA  #IMPLIED
  keep-with-previous.within-page  CDATA  #IMPLIED
  page-break-after  ( auto | always | avoid 
                    | left | right | inherit )  #IMPLIED
  page-break-before  ( auto | always | avoid 
                     | left | right | inherit )  #IMPLIED
">

<!-- Common Keeps and Breaks Properties - Inline                     -->
<!-- 'page-break-inside' shorthand property is also included         -->
<!ENTITY % keeps-and-breaks-properties-inline "
  %keeps-and-breaks-properties-atomic;
  keep-together  CDATA  #IMPLIED
  keep-together.within-line  CDATA  #IMPLIED
  keep-together.within-column  CDATA  #IMPLIED
  keep-together.within-page  CDATA  #IMPLIED
  page-break-inside  ( avoid | auto | inherit )  #IMPLIED
">

<!-- Common Keeps and Breaks Properties - Block                      -->
<!ENTITY % keeps-and-breaks-properties-block "
  %keeps-and-breaks-properties-inline;
  orphans  CDATA  #IMPLIED
  widows  CDATA  #IMPLIED
">


<!-- Leader and Rule Properties                                      -->

<!ENTITY % leader-properties "
  leader-alignment  ( none | reference-area | page | inherit )  #IMPLIED
  leader-pattern  ( space | rule | dots 
                  | use-content | inherit )  #IMPLIED
  leader-pattern-width  CDATA  #IMPLIED
  leader-length  CDATA  #IMPLIED
  leader-length.minimum  CDATA  #IMPLIED
  leader-length.optimum  CDATA  #IMPLIED
  leader-length.maximum  CDATA  #IMPLIED
  rule-style  ( none | dotted | dashed | solid | double 
              | groove | ridge | inherit )  #IMPLIED
  rule-thickness  CDATA  #IMPLIED
">

<!-- Table Properties                                                  -->
<!-- 'border-spacing' shorthand property is also included              -->
<!-- 'inherit' property added to table-omit-...er-at-break             -->

<!ENTITY % table-properties "
  border-collapse  ( collapse | collapse-with-precedence | separate | inherit )  #IMPLIED
  border-spacing  CDATA  #IMPLIED
  border-separation  CDATA  #IMPLIED
  border-separation.inline-progression-direction  CDATA  #IMPLIED
  border-separation.block-progression-direction  CDATA  #IMPLIED
  caption-side  ( before | after | start | end 
                | top | bottom | left | right | inherit )  #IMPLIED
  empty-cells  ( show | hide | inherit )  #IMPLIED
  table-layout  ( auto | fixed | inherit )  #IMPLIED
  table-omit-header-at-break  ( true | false | inherit )  #IMPLIED
  table-omit-footer-at-break  ( true | false | inherit )  #IMPLIED
">

<!-- List Properties                                                  -->

<!ENTITY % list-properties "
  provisional-distance-between-starts  CDATA  #IMPLIED
  provisional-label-separation  CDATA  #IMPLIED
">

<!-- Float Properties                                                 -->

<!ENTITY % float-properties "
  float  ( before | start | end | left | right | none | inherit )  #IMPLIED
  clear  ( start | end | left | right | both | none | inherit )  #IMPLIED
  intrusion-displace ( auto | none | line | indent | block | inherit ) #IMPLIED
">

<!-- Visibility Properties                                            -->

<!ENTITY % visibility-properties "
  visibility  ( visible | hidden | collapse | inherit )  #IMPLIED
  z-index  CDATA  #IMPLIED
">


<!-- =============================================================== -->
<!-- Set of all inheritable properties. This includes attributes     -->
<!-- marked as inheritable in the spec, as well as all features that -->
<!-- may assume a value of "inherit" (because all such features are  -->
<!-- also permitted at parent elements). By XSL design, this set     -->
<!-- comprises nearly all attributes.                                -->
<!-- =============================================================== -->

<!ENTITY % inheritable-properties "   
  color  CDATA  #IMPLIED
  relative-align  ( before | baseline | inherit )  #IMPLIED
  span  ( none | all | inherit )  #IMPLIED 

  %accessibility-properties;
  %absolute-or-relative-position-properties;
  %border-padding-background-properties;
  %border-precedence-properties;
  %aural-properties;
  %box-size-properties;
  %margin-properties-inline;
  %area-properties;
  %area-alignment-properties-inline;
  %character-properties;
  %table-properties;
  %list-properties;
  %float-properties;
  %line-related-properties;
  %leader-properties;
  %keeps-and-breaks-properties-block;
  %hyphenation-properties-block;
  %visibility-properties;
">

<!-- =============================================================== -->
<!-- Common property subsets.                                        -->
<!-- =============================================================== -->

<!-- Properties for every block that may contain text children       -->

<!ENTITY % block-properties "   
  id  CDATA  #IMPLIED
  rx:key  CDATA  #IMPLIED
  %inheritable-properties;
">

<!-- Properties for nonempty inline elements                         -->

<!ENTITY % inline-properties "   
  id  CDATA  #IMPLIED
  rx:key  CDATA  #IMPLIED
  %inheritable-properties;
">


<!-- Properties for empty inline elements that contain characters    -->

<!ENTITY % empty-inline-properties "   
  id  CDATA  #IMPLIED
  rx:key  CDATA  #IMPLIED
  color  CDATA  #IMPLIED
  %accessibility-properties;
  %aural-properties;
  %relative-position-properties;
  %area-alignment-properties-inline;
  %character-properties;
  %border-padding-background-properties;
  %hyphenation-properties-inline;
  %visibility-properties;
">

<!-- Properties for graphical inline elements                        -->

<!ENTITY % graphic-properties "   
  id  CDATA  #IMPLIED
  rx:key  CDATA  #IMPLIED
  content-type  CDATA  #IMPLIED

  %accessibility-properties;
  %relative-position-properties;
  %aural-properties;
  %border-padding-background-properties;
  %margin-properties-inline;
  %area-alignment-properties-inline;
  %box-size-properties;
  %font-properties;
  %line-height-properties;
  %keeps-and-breaks-properties-atomic;

  content-height  CDATA  #IMPLIED
  content-width  CDATA  #IMPLIED
  display-align  ( auto | before | center | after | inherit )  #IMPLIED
  overflow  ( visible | hidden | scroll | auto 
            | error-if-overflow | inherit )  #IMPLIED
  scaling  ( uniform | non-uniform | inherit )  #IMPLIED
  scaling-method  ( auto | integer-pixels 
                  | resample-any-method | inherit )  #IMPLIED
  text-align  ( start | center | end | justify 
              | inside | outside | left | right | inherit )  #IMPLIED
">



<!-- *************************************************************** -->
<!-- Content models and attributes                                   -->
<!--                                                                 -->
<!-- A. Element structure for top-level elements                     -->
<!-- *************************************************************** -->


<!-- =============================================================== -->
<!-- Root element. Contains everything, generates nothing. It has an -->
<!-- id, a FO namespace prefix declaration, and other namespace      -->
<!-- declarations if used. It can also bear inheritable properties,  -->
<!-- passed further to fo:flows/fo:static-contents. Inheritable      -->
<!-- properties from fo:layout-master-set are banned in this version -->
<!-- of the DTD.                                                     -->
<!-- =============================================================== -->

<!ELEMENT fo:root (
    rx:meta-info?,
    rx:page-device?,
    fo:layout-master-set,
    fo:declarations?,
    rx:outline?,
    fo:page-sequence+
  )
>
<!ATTLIST fo:root
  xmlns:fo  CDATA #REQUIRED
  xmlns:rx  CDATA #IMPLIED
  xmlns:svg CDATA #IMPLIED
  media-usage  ( auto | paginate | bounded-in-one-dimension | unbounded ) #IMPLIED
  %inheritable-properties;
>

<!-- =============================================================== -->
<!-- Document meta information - RenderX extension                   -->
<!-- =============================================================== -->

<!ELEMENT rx:meta-info (rx:meta-field+)>
<!ATTLIST rx:meta-info
  xmlns:rx  CDATA #IMPLIED
>

<!ELEMENT rx:meta-field EMPTY>
<!ATTLIST  rx:meta-field
    name CDATA #REQUIRED
    value CDATA #REQUIRED
>

<!ELEMENT rx:page-device EMPTY>
<!ATTLIST  rx:page-device
    input-tray CDATA #IMPLIED
    output-tray CDATA #IMPLIED
    manual-feed (true|false) #IMPLIED

    duplex (true|false) #IMPLIED
    mirror-print (true|false) #IMPLIED
    negative-print (true|false) #IMPLIED

    collate (true|false) #IMPLIED
    number-copies CDATA #IMPLIED
>

<!-- =============================================================== -->
<!-- Color profile declarations                                      -->
<!-- =============================================================== -->

<!ELEMENT fo:declarations (
    fo:color-profile+
  )
>

<!ELEMENT fo:color-profile EMPTY >

<!ATTLIST fo:color-profile
  src  CDATA  #REQUIRED
  color-profile-name  CDATA #REQUIRED
  rendering-intent  CDATA #IMPLIED
>

<!-- =============================================================== -->
<!-- Bookmarks - RenderX extension                                   -->
<!-- =============================================================== -->

<!ELEMENT rx:outline (
    rx:bookmark+
  )
>
<!ATTLIST rx:outline
  xmlns:rx  CDATA #IMPLIED
>

<!ELEMENT rx:bookmark (
    rx:bookmark-label, 
    rx:bookmark*
  ) 
>
<!ATTLIST rx:bookmark
  internal-destination  CDATA  #IMPLIED
  external-destination  CDATA  #IMPLIED
  collapse-subtree  (true | false)  #IMPLIED
>

<!ELEMENT rx:bookmark-label (#PCDATA) >


<!-- =============================================================== -->
<!-- Layout-master-set. Contains a set of page-masters. Neither of   -->
<!-- its descendants generates any area, so no inherited elements    -->
<!-- can be specified on it or on its children.                      -->
<!-- Content model made more strict than in the draft, to enforce    -->
<!-- that a page-sequence-master be always accompanied by at least   -->
<!-- one simple-page-master.                                         -->
<!-- =============================================================== -->


<!ELEMENT fo:layout-master-set 
  (
    fo:page-sequence-master*, fo:simple-page-master,
    ( fo:simple-page-master | fo:page-sequence-master )*
  )  
>

<!-- =============================================================== -->
<!-- Page sequence master                                            -->
<!-- =============================================================== -->

<!ELEMENT fo:page-sequence-master (
    (
      fo:single-page-master-reference
    | fo:repeatable-page-master-reference
    | fo:repeatable-page-master-alternatives
    )+
  )
>
<!ATTLIST fo:page-sequence-master
  master-name  CDATA  #REQUIRED
>

<!-- =============================================================== -->
<!-- Sequence specifiers are predefined sequences of page masters    -->
<!-- that are used by page sequence master to construct a desired    -->
<!-- page collection.                                                -->
<!-- =============================================================== -->

<!ELEMENT fo:single-page-master-reference    EMPTY>
<!ATTLIST fo:single-page-master-reference
  master-reference  CDATA  #REQUIRED
>

<!ELEMENT fo:repeatable-page-master-reference    EMPTY>
<!ATTLIST fo:repeatable-page-master-reference
  master-reference  CDATA  #REQUIRED
  maximum-repeats  CDATA  #IMPLIED
>

<!ELEMENT fo:repeatable-page-master-alternatives  
  ( fo:conditional-page-master-reference+ )
>
<!ATTLIST fo:repeatable-page-master-alternatives
  maximum-repeats  CDATA  #IMPLIED
>

<!ELEMENT fo:conditional-page-master-reference    EMPTY>
<!ATTLIST fo:conditional-page-master-reference
  master-reference  CDATA  #REQUIRED
  page-position  ( first | last | rest | any | inherit )  #IMPLIED
  odd-or-even  ( odd | even | any | inherit )  #IMPLIED
  blank-or-not-blank  ( blank | not-blank | any | inherit )  #IMPLIED
>

<!-- =============================================================== -->
<!-- Simple page master defines a page layout. It does not           -->
<!-- explicitly generate any content. Most of its properties are     -->
<!-- local except for writing-mode and reference-orientation that    -->
<!-- are inherited by the underlying region-* objects.               -->
<!-- =============================================================== -->

<!-- NOTE. We could think about a common background/padding/border   -->
<!-- for every page instance generated by the page master. For such  -->
<!-- a scope, we may add borders/padding/background to its features. -->
<!-- However, in the current version this is ruled out explicitly by -->
<!-- the XSL specs.                                                  -->

<!ELEMENT fo:simple-page-master 
  (
    fo:region-body,
    fo:region-before?,
    fo:region-after?,
    fo:region-start?,
    fo:region-end?
  )
>

<!ATTLIST fo:simple-page-master
  %margin-properties-CSS;
  master-name  CDATA  #REQUIRED
  page-height  CDATA  #IMPLIED
  page-width  CDATA  #IMPLIED
  size  CDATA  #IMPLIED
  reference-orientation  ( 0 | 90 | 180 | 270 | -90 | -180 | -270  
                         | 0deg  | 90deg   | 180deg  | 270deg 
                         | -90deg | -180deg | -270deg | inherit )  #IMPLIED
  writing-mode  ( lr-tb | rl-tb | tb-rl | lr | rl | tb | inherit ) #IMPLIED
>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<!-- Regions. The page instance is divided into subareas, whose      -->
<!-- properties are described by the five region-* elements. These   -->
<!-- elements by themselves do not generate any content.             -->
<!-- Reference-orientation and writing-mode may be inherited from    -->
<!-- the page master; all other features are local.                  -->
<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->

<!ENTITY % region-properties "
  %border-padding-background-properties;
  %area-properties;

  region-name  CDATA  #IMPLIED
">

<!-- =============================================================== -->
<!-- Body region: middle of the page. Unlike side regions, this one  -->
<!-- may have multiple columns.                                      -->
<!-- [!] We have restricted margin properties to be margin-only,     -->
<!-- allowing no spaces. This is done because no clear semantics     -->
<!-- can be ascribed to single components of a space vector.         -->
<!-- =============================================================== -->

<!ELEMENT fo:region-body EMPTY>
<!ATTLIST fo:region-body
  %region-properties;
  %margin-properties-CSS;
  column-count  CDATA  #IMPLIED
  column-gap  CDATA  #IMPLIED
>

<!-- =============================================================== -->
<!-- Side regions: page edges. These regions have extent and         -->
<!-- precedence that is used to arbitrate corner conflicts. Side     -->
<!-- regions are viewed as frames, and may not have margins.         -->
<!-- Extent made obligatory: its default value of 0.0pt does not     -->
<!-- make much sense.                                                -->
<!-- =============================================================== -->

<!ENTITY % side-region-properties "
  %region-properties;
  extent  CDATA  #REQUIRED
  precedence  ( true | false | inherit )  #IMPLIED
">

<!ELEMENT fo:region-before EMPTY>
<!ATTLIST fo:region-before %side-region-properties;>

<!ELEMENT fo:region-after EMPTY>
<!ATTLIST fo:region-after %side-region-properties;>

<!ELEMENT fo:region-start EMPTY>
<!ATTLIST fo:region-start %side-region-properties;>

<!ELEMENT fo:region-end EMPTY>
<!ATTLIST fo:region-end %side-region-properties;>

<!-- =============================================================== -->
<!-- Page sequence defines the order of choosing page masters to     -->
<!-- accomodate all the contents generated by its fo:flow and        -->
<!-- fo:static-content children, and the way of numbering them.      -->
<!-- =============================================================== -->

<!ELEMENT fo:page-sequence
  (
    fo:title?,
    fo:static-content*,
    fo:flow
  )
>
<!ATTLIST fo:page-sequence
  id  CDATA  #IMPLIED
  rx:key  CDATA  #IMPLIED
  master-reference  CDATA  #REQUIRED

  initial-page-number  CDATA  #IMPLIED
  force-page-count  ( auto | even | odd | end-on-even 
                    | end-on-odd | no-force | inherit)  #IMPLIED

  format  CDATA  #IMPLIED
  letter-value  ( auto | alphabetic | traditional  )  #IMPLIED
  grouping-separator  CDATA  #IMPLIED
  grouping-size  CDATA  #IMPLIED

  %inheritable-properties;
>

<!-- =============================================================== -->
<!-- Title may not contain out-of-lines.                             -->
<!-- =============================================================== -->

<!ELEMENT fo:title     
    ( #PCDATA 
  | %basic-inlines; 
  | %wrappers; )*
>

<!ATTLIST fo:title  %inheritable-properties;>


<!-- *************************************************************** -->
<!-- B. Element structure for content-bearing elements               --> 
<!-- *************************************************************** -->

<!-- =============================================================== -->
<!-- Flows. They are just sequences of blocks. 'flow-name' feature   -->
<!-- defines linkage of the flow to a region in the page master.     -->
<!-- =============================================================== -->

<!-- =============================================================== -->
<!-- An extension element, fo:flow-section, has been added in order  -->
<!-- to overcome limitations on multicolumn layout imposed by XSL FO -->
<!-- =============================================================== -->

<!ENTITY % flow-properties "
  id  CDATA  #IMPLIED    
  rx:key  CDATA  #IMPLIED
  flow-name  CDATA  #REQUIRED
  %inheritable-properties;
">

<!ELEMENT fo:static-content (%blocks;)+ >
<!ATTLIST fo:static-content %flow-properties; >

<!ELEMENT fo:flow (%blocks; | rx:flow-section)+ >
<!ATTLIST fo:flow %flow-properties; >

<!-- Extension element. Acts like a top-level block -->
<!-- with multiple columns.                         -->

<!ELEMENT rx:flow-section (%blocks;)+ >
<!ATTLIST rx:flow-section
  column-count CDATA #IMPLIED
  column-gap CDATA #IMPLIED
  %block-properties; 
>

<!-- =============================================================== -->
<!-- Block is the base element for all content areas. Besides        -->
<!-- properties used to format the block itself, it also conveys     -->
<!-- formatting information to its inline-level children.            -->
<!-- =============================================================== -->

<!ELEMENT fo:block (
    #PCDATA
  | fo:initial-property-set
  | %basic-inlines; 
  | %basic-blocks; 
  | %out-of-lines; 
  | %wrappers; 
  )*
>
<!ATTLIST fo:block %block-properties;>

<!-- =============================================================== -->
<!-- Block container                                                 -->
<!-- =============================================================== -->
<!ELEMENT fo:block-container ( %blocks; )+ >
<!ATTLIST fo:block-container %block-properties;>

<!-- *************************************************************** -->
<!-- Inline elements                                                 --> 
<!-- *************************************************************** -->

<!-- =============================================================== -->
<!-- Unicode bidi-override                                           -->
<!-- =============================================================== -->

<!ELEMENT fo:bidi-override ( %inlines; )*>
<!ATTLIST fo:bidi-override %inline-properties;>

<!-- =============================================================== -->
<!-- Single character                                                -->
<!-- =============================================================== -->

<!ELEMENT fo:character EMPTY>
<!ATTLIST fo:character
  character  CDATA  #REQUIRED
  %empty-inline-properties;
>

<!-- =============================================================== -->
<!-- Initial property set specifies properties for one or more lines -->
<!-- =============================================================== -->

<!ELEMENT fo:initial-property-set EMPTY>
<!ATTLIST fo:initial-property-set 
  %empty-inline-properties; 
>

<!-- =============================================================== -->
<!-- External graphic                                                -->
<!-- =============================================================== -->

<!ELEMENT fo:external-graphic EMPTY >
<!ATTLIST fo:external-graphic
  %graphic-properties;
  src  CDATA  #IMPLIED
>

<!-- =============================================================== -->
<!-- In-stream graphic                                               -->
<!-- =============================================================== -->

<!ELEMENT fo:instream-foreign-object ANY>
<!ATTLIST fo:instream-foreign-object %graphic-properties;>


<!-- =============================================================== -->
<!-- An element to mark a point in the XML output (RenderX extension)-->
<!-- =============================================================== -->

<!ELEMENT rx:pinpoint EMPTY>
<!ATTLIST rx:pinpoint
  value CDATA  #REQUIRED

  %accessibility-properties;
  %relative-position-properties;
  %area-alignment-properties-inline;
  %keeps-and-breaks-properties-atomic;
>

<!-- =============================================================== -->
<!-- Inline                                                          -->
<!-- =============================================================== -->

<!ELEMENT fo:inline ( %mixed-level; )*>
<!ATTLIST fo:inline %inline-properties;>

<!-- =============================================================== -->
<!-- Inline container                                                -->
<!-- =============================================================== -->

<!ELEMENT fo:inline-container ( %blocks; )*>
<!ATTLIST fo:inline-container %inline-properties;>

<!-- =============================================================== -->
<!-- Leader                                                          -->
<!-- =============================================================== -->

<!ELEMENT fo:leader ( %inlines; )*>
<!ATTLIST fo:leader 
  %inline-properties;
  >

<!-- =============================================================== -->
<!-- Page Number                                                     -->
<!-- =============================================================== -->

<!ELEMENT fo:page-number EMPTY>
<!ATTLIST fo:page-number %empty-inline-properties;>

<!-- =============================================================== -->
<!-- Page number citation                                            -->
<!-- =============================================================== -->

<!ELEMENT fo:page-number-citation EMPTY>
<!ATTLIST fo:page-number-citation
  %empty-inline-properties;
  ref-id  CDATA  #REQUIRED 
>

<!-- =============================================================== -->
<!-- Page number list - index entry                                  -->
<!-- =============================================================== -->

<!ELEMENT rx:page-index EMPTY>
<!ATTLIST rx:page-index
  %empty-inline-properties;
  ref-key  CDATA  #REQUIRED 
  list-separator  CDATA  #IMPLIED
  range-separator  CDATA  #IMPLIED
  merge-subsequent-page-numbers  CDATA  #IMPLIED
>



<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<!-- Formatting objects for tables.                                  -->
<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->

<!-- =============================================================== -->
<!-- Table & Caption is a wrapper to all the stuff pertinent to a    -->
<!-- given table. It generates a block consisting of two subblocks:  -->
<!-- one for the caption, another one for the table itself. The      -->
<!-- placement of these two blocks is controlled by the              -->
<!-- 'caption-side' property: if  caption-side="before"|"after" (or  -->
<!-- their absolute orientation equivalents), the two blocks are     -->
<!-- drawn one after another; if it is "start"|"end", then the       -->
<!-- caption is displayed on the correspondent side of the table.    -->
<!-- In this case, the relative alignment of the two blocks is given -->
<!-- by the 'relative-align'/'display-align' property.               -->
<!--                                                                 -->
<!-- =============================================================== -->

<!ELEMENT fo:table-and-caption (
    fo:table-caption?,
    fo:table
  )
>

<!ATTLIST fo:table-and-caption %block-properties;>


<!-- =============================================================== -->
<!-- Table caption is an area container.                             -->
<!-- =============================================================== -->

<!ELEMENT fo:table-caption ( %blocks; )+ >
<!ATTLIST fo:table-caption %block-properties;>


<!-- =============================================================== -->
<!-- fo:table is the basic element for all tables. All the contents  -->
<!-- placed inside it is distributed over a single rectangular grid  -->
<!-- of rows and columns.                                            -->
<!-- =============================================================== -->


<!ELEMENT fo:table (
    fo:table-column*,
    fo:table-header?,
    fo:table-footer?,
    fo:table-body+
  )
>
<!ATTLIST fo:table  %block-properties;>


<!-- =============================================================== -->
<!-- Table column specifies common properties to ascribe to all      -->
<!-- cells in a column *or a group of columns*. Note that, if both   -->
<!-- 'number-columns-repeated' and 'number-columns-spanned' exceed   -->
<!-- 1, the column counter is increased by 'number-columns-spanned'. -->
<!-- it means that you only set properties for columns:              --> 
<!--      'column-number'                                            -->
<!--      'column-number' + 'number-columns-spanned'                 -->
<!--      'column-number' + 2 * 'number-columns-spanned'             -->
<!-- and so on, leaving default properties for intermediate columns. -->
<!-- =============================================================== -->

<!ELEMENT fo:table-column      EMPTY >
<!ATTLIST fo:table-column
  column-number  CDATA  #IMPLIED
  column-width  CDATA  #IMPLIED
  number-columns-repeated  CDATA  #IMPLIED
  number-columns-spanned  CDATA  #IMPLIED
  %inheritable-properties;
>


<!-- =============================================================== -->
<!-- Table header, table footer, and table body are wrappers for     -->
<!-- groups of rows. They contain either one or more fo:table-rows,  -->
<!-- or one or more fo:table-cells; in the latter case, row breaks   -->
<!-- are specified in the cells by 'starts-row'/'ends-row'.          --> 
<!-- All these elements are identical both in the content structure  -->
<!-- and in the attributes.                                          -->
<!-- =============================================================== -->

<!ENTITY % row-group " fo:table-row+ | fo:table-cell+ ">

<!ELEMENT fo:table-header ( %row-group; ) >
<!ATTLIST fo:table-header
  id  CDATA  #IMPLIED 
  rx:key  CDATA  #IMPLIED
  %inheritable-properties; 
>

<!ELEMENT fo:table-footer ( %row-group;) >
<!ATTLIST fo:table-footer
  id  CDATA  #IMPLIED 
  rx:key  CDATA  #IMPLIED
  %inheritable-properties; 
>

<!ELEMENT fo:table-body ( %row-group; )>
<!ATTLIST fo:table-body
  id  CDATA  #IMPLIED 
  rx:key  CDATA  #IMPLIED
  %inheritable-properties; 
>


<!-- =============================================================== -->
<!-- Table row.                                                      -->
<!-- =============================================================== -->

<!ELEMENT fo:table-row ( fo:table-cell+ ) >
<!ATTLIST fo:table-row
  id  CDATA  #IMPLIED 
  rx:key  CDATA  #IMPLIED
  %inheritable-properties; 
>

<!-- =============================================================== -->
<!-- Table cell.                                                     -->
<!-- =============================================================== -->

<!ELEMENT fo:table-cell ( %blocks; )+ >
<!ATTLIST fo:table-cell
  %block-properties; 

  column-number  CDATA  #IMPLIED
  ends-row  ( true | false )  #IMPLIED
  number-columns-spanned  CDATA  #IMPLIED
  number-rows-spanned  CDATA  #IMPLIED
  starts-row  ( true | false )  #IMPLIED
>

<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<!-- Formatting objects for lists.                                   -->
<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->

<!-- =============================================================== -->
<!-- List block is a block, with some extra features to control the  -->
<!-- disposition of list items.                                      -->
<!-- =============================================================== -->

<!ELEMENT fo:list-block ( fo:list-item+ ) >
<!ATTLIST fo:list-block %block-properties;>

<!-- =============================================================== -->
<!-- List item is a coupling of item label and item body.            -->
<!-- =============================================================== -->

<!ELEMENT fo:list-item ( fo:list-item-label, fo:list-item-body ) >
<!ATTLIST fo:list-item %block-properties;>


<!-- =============================================================== -->
<!-- List item label and list item body                              -->
<!-- =============================================================== -->

<!ELEMENT fo:list-item-label ( %blocks; )+ >
<!ATTLIST fo:list-item-label %block-properties;>

<!ELEMENT fo:list-item-body ( %blocks;)+ >
<!ATTLIST fo:list-item-body %block-properties;>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<!-- Out-of-lines.                                                   -->
<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->

<!-- =============================================================== -->
<!-- Floats and footnotes resemble containers. Accordingly, we treat -->
<!-- them as block sequences.                                        -->
<!-- =============================================================== -->

<!ELEMENT fo:float ( %blocks; )+ >
<!ATTLIST fo:float %block-properties;>


<!ELEMENT fo:footnote (
  fo:inline,
  fo:footnote-body 
  )
>

<!ATTLIST fo:footnote %block-properties;>


<!ELEMENT fo:footnote-body ( %blocks; )+ >
<!ATTLIST fo:footnote-body %block-properties;>


<!-- =============================================================== -->
<!-- Simple link. From the formatting point of view, it's nothing    -->
<!-- but a regular inline sequence.                                  -->
<!-- =============================================================== -->

<!ELEMENT fo:basic-link ( %mixed-level; )* >
<!ATTLIST fo:basic-link
  %inline-properties;

  external-destination  CDATA  #IMPLIED
  internal-destination  CDATA  #IMPLIED
  indicate-destination  ( true | false )  #IMPLIED
  show-destination  ( replace | new )  #IMPLIED
  destination-placement-offset  CDATA  #IMPLIED
  target-processing-context  CDATA  #IMPLIED
  target-presentation-context  CDATA  #IMPLIED
  target-stylesheet  CDATA  #IMPLIED
>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<!-- Wrappers and Markers.                                           -->
<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->

<!-- =============================================================== -->
<!-- Wrapper. This may be useful but breaks every effort to validate -->
<!-- content models for blocks and inlines.                          -->
<!-- =============================================================== -->

<!ELEMENT fo:wrapper ( %mixed-level; )* >
<!ATTLIST fo:wrapper 
  id  CDATA  #IMPLIED
  rx:key  CDATA  #IMPLIED
  %inheritable-properties; 
>

<!-- =============================================================== -->
<!-- Marker. This element may embrace any content but cannot pass    -->
<!-- properties to its children; so, it may not have features other  -->
<!-- than marker-class-name.                                         -->
<!-- =============================================================== -->

<!ELEMENT fo:marker ( %mixed-level; )* >
<!ATTLIST fo:marker  
  marker-class-name  CDATA  #IMPLIED
>

<!-- =============================================================== -->
<!-- Marker retrieval.                                               -->
<!-- =============================================================== -->

<!ELEMENT fo:retrieve-marker EMPTY>
<!ATTLIST fo:retrieve-marker  
  retrieve-class-name  CDATA  #IMPLIED
  retrieve-position  ( first-starting-within-page 
                     | first-including-carryover 
                     | last-starting-within-page 
                     | last-ending-within-page )  #IMPLIED
  retrieve-boundary  ( page | page-sequence | document )  #IMPLIED
>

<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<!-- Multistate stuff. This section is the least developed in the    -->
<!-- whole DTD, and most solutions are arbitrary. We beg thy pardon. -->
<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->

<!-- =============================================================== -->
<!-- Switch. This is a pure logical operator; no formatting may be   -->
<!-- conveyed through it.                                            -->
<!-- =============================================================== -->

<!ELEMENT fo:multi-switch ( fo:multi-case )+ >
<!ATTLIST fo:multi-switch
  %inheritable-properties; 

  id  CDATA  #IMPLIED
  rx:key  CDATA  #IMPLIED
  auto-restore  ( true | false )  #IMPLIED
>

<!-- =============================================================== -->
<!-- Single case. Block-level formatting may be conveyed.            -->
<!-- =============================================================== -->

<!ELEMENT fo:multi-case ( %mixed-level; )* >

<!ATTLIST fo:multi-case
  %inheritable-properties; 

  id  CDATA  #IMPLIED
  rx:key  CDATA  #IMPLIED
  starting-state  CDATA  #IMPLIED
  case-name  CDATA  #IMPLIED
  case-title  CDATA  #IMPLIED
>

<!-- =============================================================== -->
<!-- Toggle. This is a typical inline.                               -->
<!-- =============================================================== -->

<!ELEMENT fo:multi-toggle ( %inlines; )*>
<!ATTLIST fo:multi-toggle
  %inheritable-properties; 

  id  CDATA  #IMPLIED
  rx:key  CDATA  #IMPLIED
  switch-to  CDATA  #IMPLIED
>


<!-- =============================================================== -->
<!-- Multi-properties is listed among block-level elements.          -->
<!-- Formatting common to all property sets can be specified here;   -->
<!-- we expect it to be block-level only.                            -->
<!-- =============================================================== -->


<!ELEMENT fo:multi-properties 
  (
    fo:multi-property-set+,
    fo:wrapper
  )
>
<!ATTLIST fo:multi-properties %block-properties;>

<!-- =============================================================== -->
<!-- Multi property set. Since these are properties of a             -->
<!-- fo:multi-properties that is considered a block, we accept only  -->
<!-- block properties here.                                          -->
<!-- =============================================================== -->

<!ELEMENT fo:multi-property-set EMPTY>
<!ATTLIST fo:multi-property-set
  %block-properties;
  active-state  ( link | visited | active | hover | focus )  #REQUIRED
>