]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
FOP-1099: process footnotes coming from table headers or footers
authorVincent Hennebert <vhennebert@apache.org>
Mon, 2 Jun 2014 20:19:36 +0000 (20:19 +0000)
committerVincent Hennebert <vhennebert@apache.org>
Mon, 2 Jun 2014 20:19:36 +0000 (20:19 +0000)
The footnote will appear once at the first (resp. last) occurrence of the table-header (resp. -footer).

Patch by Matthias Reischenbacher, applied with modifications.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1599344 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/layoutmgr/FootenoteUtil.java [new file with mode: 0644]
src/java/org/apache/fop/layoutmgr/inline/LineLayoutManager.java
src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java
src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java
test/layoutengine/standard-testcases/footnote_in_table-header.xml [new file with mode: 0644]

diff --git a/src/java/org/apache/fop/layoutmgr/FootenoteUtil.java b/src/java/org/apache/fop/layoutmgr/FootenoteUtil.java
new file mode 100644 (file)
index 0000000..0b8b59f
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.layoutmgr;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.apache.fop.layoutmgr.inline.KnuthInlineBox;
+
+public final class FootenoteUtil {
+
+    private FootenoteUtil() {
+    }
+
+    /**
+     * Returns the footnotes contained in the given element list.
+     */
+    public static List<LayoutManager> getFootnotes(List<ListElement> elemenList) {
+        return getFootnotes(elemenList, 0, elemenList.size() - 1);
+    }
+
+    /**
+     * Returns the footnotes contained in the given element list.
+     *
+     * @param startIndex index in the element list from which to start the scan, inclusive
+     * @param endIndex index in the element list at which to stop the scan, inclusive
+     */
+    public static List<LayoutManager> getFootnotes(List<ListElement> elemenList, int startIndex, int endIndex) {
+        ListIterator<ListElement> iter = elemenList.listIterator(startIndex);
+        List<LayoutManager> footnotes = null;
+        while (iter.nextIndex() <= endIndex) {
+            ListElement element = iter.next();
+            if (element instanceof KnuthInlineBox && ((KnuthInlineBox) element).isAnchor()) {
+                footnotes = getFootnoteList(footnotes);
+                footnotes.add(((KnuthInlineBox) element).getFootnoteBodyLM());
+            } else if (element instanceof KnuthBlockBox && ((KnuthBlockBox) element).hasAnchors()) {
+                footnotes = getFootnoteList(footnotes);
+                footnotes.addAll(((KnuthBlockBox) element).getFootnoteBodyLMs());
+            }
+        }
+        if (footnotes == null) {
+            return Collections.emptyList();
+        } else {
+            return footnotes;
+        }
+    }
+
+    private static <T> List<T> getFootnoteList(List<T> footnotes) {
+        if (footnotes == null) {
+            return new ArrayList<T>();
+        } else {
+            return footnotes;
+        }
+    }
+
+}
index 25d8c08721b989ad1e89dd3b93df7bd523a3447b..28d49031f05d392a98e3a8efe2f1bc8560abc8b1 100644 (file)
@@ -50,6 +50,7 @@ import org.apache.fop.layoutmgr.BlockLevelLayoutManager;
 import org.apache.fop.layoutmgr.BreakElement;
 import org.apache.fop.layoutmgr.BreakingAlgorithm;
 import org.apache.fop.layoutmgr.ElementListObserver;
+import org.apache.fop.layoutmgr.FootenoteUtil;
 import org.apache.fop.layoutmgr.InlineKnuthSequence;
 import org.apache.fop.layoutmgr.Keep;
 import org.apache.fop.layoutmgr.KnuthBlockBox;
@@ -979,17 +980,7 @@ public class LineLayoutManager extends InlineStackingLayoutManager
                     endIndex = ((LineBreakPosition) llPoss.getChosenPosition(i)).getLeafPos();
                     // create a list of the FootnoteBodyLM handling footnotes
                     // whose citations are in this line
-                    List<LayoutManager> footnoteList = new LinkedList<LayoutManager>();
-                    ListIterator<KnuthElement> elementIterator = seq.listIterator(startIndex);
-                    while (elementIterator.nextIndex() <= endIndex) {
-                        KnuthElement element = elementIterator.next();
-                        if (element instanceof KnuthInlineBox
-                                && ((KnuthInlineBox) element).isAnchor()) {
-                            footnoteList.add(((KnuthInlineBox) element).getFootnoteBodyLM());
-                        } else if (element instanceof KnuthBlockBox) {
-                            footnoteList.addAll(((KnuthBlockBox) element).getFootnoteBodyLMs());
-                        }
-                    }
+                    List<LayoutManager> footnoteList = FootenoteUtil.getFootnotes(seq, startIndex, endIndex);
                     startIndex = endIndex + 1;
                     LineBreakPosition lbp = (LineBreakPosition) llPoss.getChosenPosition(i);
                     if (baselineOffset < 0) {
index 7735066326a83c069fccf678f5b84751a2b994bd..053452f03f8777822f8d055da786a88b9f775fc6 100644 (file)
@@ -39,7 +39,7 @@ import org.apache.fop.layoutmgr.BreakOpportunity;
 import org.apache.fop.layoutmgr.BreakOpportunityHelper;
 import org.apache.fop.layoutmgr.ElementListObserver;
 import org.apache.fop.layoutmgr.ElementListUtils;
-import org.apache.fop.layoutmgr.FootnoteBodyLayoutManager;
+import org.apache.fop.layoutmgr.FootenoteUtil;
 import org.apache.fop.layoutmgr.Keep;
 import org.apache.fop.layoutmgr.KnuthBlockBox;
 import org.apache.fop.layoutmgr.KnuthBox;
@@ -322,18 +322,9 @@ public class ListItemLayoutManager extends SpacedBorderedPaddedBlockLayoutManage
             // collect footnote information
             // TODO this should really not be done like this. ListItemLM should remain as
             // footnote-agnostic as possible
-            LinkedList<FootnoteBodyLayoutManager> footnoteList = null;
-            ListElement el;
+            LinkedList<LayoutManager> footnoteList = new LinkedList<LayoutManager>();
             for (int i = 0; i < elementLists.length; i++) {
-                for (int j = start[i]; j <= end[i]; j++) {
-                    el = (ListElement) elementLists[i].get(j);
-                    if (el instanceof KnuthBlockBox && ((KnuthBlockBox) el).hasAnchors()) {
-                        if (footnoteList == null) {
-                            footnoteList = new LinkedList<FootnoteBodyLayoutManager>();
-                        }
-                        footnoteList.addAll(((KnuthBlockBox) el).getFootnoteBodyLMs());
-                    }
-                }
+                footnoteList.addAll(FootenoteUtil.getFootnotes(elementLists[i], start[i], end[i]));
             }
 
             // add the new elements
index 4f17c2d0caa0e052ac3e68014df45262d368077e..d4b54939faf62ff26eed46db7f585fac787415cd 100644 (file)
@@ -39,12 +39,15 @@ import org.apache.fop.fo.flow.table.TableBody;
 import org.apache.fop.fo.flow.table.TablePart;
 import org.apache.fop.layoutmgr.BreakElement;
 import org.apache.fop.layoutmgr.ElementListUtils;
+import org.apache.fop.layoutmgr.FootenoteUtil;
 import org.apache.fop.layoutmgr.Keep;
+import org.apache.fop.layoutmgr.KnuthBlockBox;
 import org.apache.fop.layoutmgr.KnuthBox;
 import org.apache.fop.layoutmgr.KnuthElement;
 import org.apache.fop.layoutmgr.KnuthGlue;
 import org.apache.fop.layoutmgr.KnuthPossPosIter;
 import org.apache.fop.layoutmgr.LayoutContext;
+import org.apache.fop.layoutmgr.LayoutManager;
 import org.apache.fop.layoutmgr.ListElement;
 import org.apache.fop.layoutmgr.Position;
 import org.apache.fop.layoutmgr.PositionIterator;
@@ -147,6 +150,7 @@ public class TableContentLayoutManager implements PercentBaseContext {
         KnuthBox headerAsFirst = null;
         KnuthBox headerAsSecondToLast = null;
         KnuthBox footerAsLast = null;
+        LinkedList returnList = new LinkedList();
         if (headerIter != null && headerList == null) {
             this.headerList = getKnuthElementsForRowIterator(
                     headerIter, context, alignment, TableRowIterator.HEADER);
@@ -158,12 +162,18 @@ public class TableContentLayoutManager implements PercentBaseContext {
             }
             TableHeaderFooterPosition pos = new TableHeaderFooterPosition(
                     getTableLM(), true, this.headerList);
-            KnuthBox box = new KnuthBox(headerNetHeight, pos, false);
+            List<LayoutManager> footnoteList = FootenoteUtil.getFootnotes(headerList);
+            KnuthBox box = (footnoteList.isEmpty() || !getTableLM().getTable().omitHeaderAtBreak())
+                    ? new KnuthBox(headerNetHeight, pos, false)
+                    : new KnuthBlockBox(headerNetHeight, footnoteList, pos, false);
             if (getTableLM().getTable().omitHeaderAtBreak()) {
                 //We can simply add the table header at the start
                 //of the whole list
                 headerAsFirst = box;
             } else {
+                if (!footnoteList.isEmpty()) {
+                    returnList.add(new KnuthBlockBox(0, footnoteList, new Position(getTableLM()), true));
+                }
                 headerAsSecondToLast = box;
             }
         }
@@ -179,11 +189,13 @@ public class TableContentLayoutManager implements PercentBaseContext {
             //We can simply add the table footer at the end of the whole list
             TableHeaderFooterPosition pos = new TableHeaderFooterPosition(
                     getTableLM(), false, this.footerList);
-            KnuthBox box = new KnuthBox(footerNetHeight, pos, false);
-            footerAsLast = box;
+            List<LayoutManager> footnoteList = FootenoteUtil.getFootnotes(footerList);
+            footerAsLast = footnoteList.isEmpty()
+                    ? new KnuthBox(footerNetHeight, pos, false)
+                    : new KnuthBlockBox(footerNetHeight, footnoteList, pos, false);
         }
-        LinkedList returnList = getKnuthElementsForRowIterator(
-                bodyIter, context, alignment, TableRowIterator.BODY);
+        returnList.addAll(getKnuthElementsForRowIterator(
+                bodyIter, context, alignment, TableRowIterator.BODY));
         if (headerAsFirst != null) {
             int insertionPoint = 0;
             if (returnList.size() > 0 && ((ListElement)returnList.getFirst()).isForcedBreak()) {
diff --git a/test/layoutengine/standard-testcases/footnote_in_table-header.xml b/test/layoutengine/standard-testcases/footnote_in_table-header.xml
new file mode 100644 (file)
index 0000000..11ec1bd
--- /dev/null
@@ -0,0 +1,373 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- $Id$ -->
+<testcase>
+  <info>
+    <p>
+      A footnote from a table-header should appear once at the bottom of the first page.
+    </p>
+  </info>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="page" page-height="120pt" page-width="220pt" margin="10pt">
+          <fo:region-body background-color="#F0F0F0"/>
+        </fo:simple-page-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="page" font-size="8pt" line-height="10pt">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block>Before the table</fo:block>
+          <fo:table table-layout="fixed" width="100%">
+            <fo:table-column column-width="proportional-column-width(1)"/>
+            <fo:table-column column-width="proportional-column-width(1)"/>
+            <fo:table-header border="1pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Header 1.1<fo:footnote>
+                      <fo:inline>*</fo:inline>
+                      <fo:footnote-body>
+                        <fo:block>* Footnote from the table-header.</fo:block>
+                      </fo:footnote-body>
+                    </fo:footnote></fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Header 1.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-header>
+            <fo:table-footer border="1pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Footer 1.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Footer 1.2<fo:footnote>
+                      <fo:inline>†</fo:inline>
+                      <fo:footnote-body>
+                        <fo:block>† Footnote from the table-footer.</fo:block>
+                      </fo:footnote-body>
+                    </fo:footnote></fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-footer>
+            <fo:table-body border="0.5pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 1.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 1.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 2.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 2.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+        </fo:flow>
+      </fo:page-sequence>
+      <fo:page-sequence master-reference="page" font-size="8pt" line-height="10pt">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block>Before the table</fo:block>
+          <fo:table table-layout="fixed" width="100%">
+            <fo:table-column column-width="proportional-column-width(1)"/>
+            <fo:table-column column-width="proportional-column-width(1)"/>
+            <fo:table-header border="1pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Header 1.1<fo:footnote>
+                      <fo:inline>*</fo:inline>
+                      <fo:footnote-body>
+                        <fo:block>* Footnote from the table-header.</fo:block>
+                      </fo:footnote-body>
+                    </fo:footnote></fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Header 1.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-header>
+            <fo:table-footer border="1pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Footer 1.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Footer 1.2<fo:footnote>
+                      <fo:inline>†</fo:inline>
+                      <fo:footnote-body>
+                        <fo:block>† Footnote from the table-footer.</fo:block>
+                      </fo:footnote-body>
+                    </fo:footnote></fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-footer>
+            <fo:table-body border="0.5pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 1.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 1.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 2.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 2.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 3.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 3.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 4.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 4.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 5.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 5.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 6.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 6.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 7.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 7.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+        </fo:flow>
+      </fo:page-sequence>
+      <fo:page-sequence master-reference="page" font-size="8pt" line-height="10pt">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block>Before the table</fo:block>
+          <fo:table table-layout="fixed" width="100%"
+            table-omit-header-at-break="true" table-omit-footer-at-break="true">
+            <fo:table-column column-width="proportional-column-width(1)"/>
+            <fo:table-column column-width="proportional-column-width(1)"/>
+            <fo:table-header border="1pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Header 1.1<fo:footnote>
+                      <fo:inline>*</fo:inline>
+                      <fo:footnote-body>
+                        <fo:block>* Footnote from the table-header.</fo:block>
+                      </fo:footnote-body>
+                    </fo:footnote></fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Header 1.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-header>
+            <fo:table-footer border="1pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Footer 1.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Footer 1.2<fo:footnote>
+                      <fo:inline>†</fo:inline>
+                      <fo:footnote-body>
+                        <fo:block>† Footnote from the table-footer.</fo:block>
+                      </fo:footnote-body>
+                    </fo:footnote></fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-footer>
+            <fo:table-body border="0.5pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 1.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 1.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 2.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 2.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+        </fo:flow>
+      </fo:page-sequence>
+      <fo:page-sequence master-reference="page" font-size="8pt" line-height="10pt">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block>Before the table</fo:block>
+          <fo:table table-layout="fixed" width="100%"
+            table-omit-header-at-break="true" table-omit-footer-at-break="true">
+            <fo:table-column column-width="proportional-column-width(1)"/>
+            <fo:table-column column-width="proportional-column-width(1)"/>
+            <fo:table-header border="1pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Header 1.1<fo:footnote>
+                      <fo:inline>*</fo:inline>
+                      <fo:footnote-body>
+                        <fo:block>* Footnote from the table-header.</fo:block>
+                      </fo:footnote-body>
+                    </fo:footnote></fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Header 1.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-header>
+            <fo:table-footer border="1pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Footer 1.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Footer 1.2<fo:footnote>
+                      <fo:inline>†</fo:inline>
+                      <fo:footnote-body>
+                        <fo:block>† Footnote from the table-footer.</fo:block>
+                      </fo:footnote-body>
+                    </fo:footnote></fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-footer>
+            <fo:table-body border="0.5pt solid black">
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 1.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 1.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 2.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 2.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 3.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 3.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 4.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 4.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 5.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 5.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 6.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 6.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+              <fo:table-row border="inherit">
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 7.1</fo:block>
+                </fo:table-cell>
+                <fo:table-cell border="inherit">
+                  <fo:block>Cell 7.2</fo:block>
+                </fo:table-cell>
+              </fo:table-row>
+            </fo:table-body>
+          </fo:table>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+    <eval expected="1"                           xpath="count(//pageSequence[1]/pageViewport)"/>
+    <eval expected="Header 1.1*"                       xpath="//pageSequence[1]//flow/block[2]/block[1]"/>
+    <eval expected="Footer 1.2†"                       xpath="//pageSequence[1]//flow/block[2]/block[8]"/>
+    <eval expected="2"                           xpath="count(//pageSequence[1]//footnote/block)"/>
+    <eval expected="* Footnote from the table-header." xpath="//pageSequence[1]//footnote/block[1]"/>
+    <eval expected="† Footnote from the table-footer." xpath="//pageSequence[1]//footnote/block[2]"/>
+
+    <eval expected="2"                           xpath="count(//pageSequence[2]/pageViewport)"/>
+    <eval expected="1"                           xpath="count(//pageSequence[2]/pageViewport[1]//footnote/block)"/>
+    <eval expected="* Footnote from the table-header." xpath="//pageSequence[2]/pageViewport[1]//footnote/block[1]"/>
+    <eval expected="Cell 6.1"                          xpath="//pageSequence[2]/pageViewport[2]//flow/block[1]/block[3]"/>
+    <eval expected="1"                           xpath="count(//pageSequence[2]/pageViewport[2]//footnote/block)"/>
+    <eval expected="† Footnote from the table-footer." xpath="//pageSequence[2]/pageViewport[2]//footnote/block[1]"/>
+
+    <eval expected="1"                           xpath="count(//pageSequence[3]/pageViewport)"/>
+    <eval expected="Header 1.1*"                       xpath="//pageSequence[3]//flow/block[2]/block[1]"/>
+    <eval expected="Footer 1.2†"                       xpath="//pageSequence[3]//flow/block[2]/block[8]"/>
+    <eval expected="2"                           xpath="count(//pageSequence[3]//footnote/block)"/>
+    <eval expected="* Footnote from the table-header." xpath="//pageSequence[3]//footnote/block[1]"/>
+    <eval expected="† Footnote from the table-footer." xpath="//pageSequence[3]//footnote/block[2]"/>
+
+    <eval expected="2"                           xpath="count(//pageSequence[4]/pageViewport)"/>
+    <eval expected="1"                           xpath="count(//pageSequence[4]/pageViewport[1]//footnote/block)"/>
+    <eval expected="* Footnote from the table-header." xpath="//pageSequence[4]/pageViewport[1]//footnote/block[1]"/>
+    <eval expected="Cell 7.1"                          xpath="//pageSequence[4]/pageViewport[2]//flow/block[1]/block[1]"/>
+    <eval expected="1"                           xpath="count(//pageSequence[4]/pageViewport[2]//footnote/block)"/>
+    <eval expected="† Footnote from the table-footer." xpath="//pageSequence[4]/pageViewport[2]//footnote/block[1]"/>
+  </checks>
+</testcase>