diff options
8 files changed, 374 insertions, 24 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java index 6a3a38db1..9d08415ff 100644 --- a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java @@ -26,7 +26,6 @@ import java.util.ListIterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.apache.fop.area.Area; import org.apache.fop.area.Block; import org.apache.fop.fo.flow.ListItem; @@ -39,12 +38,14 @@ import org.apache.fop.layoutmgr.ConditionalElementListener; import org.apache.fop.layoutmgr.ElementListObserver; import org.apache.fop.layoutmgr.ElementListUtils; import org.apache.fop.layoutmgr.KeepUtil; +import org.apache.fop.layoutmgr.KnuthBlockBox; import org.apache.fop.layoutmgr.KnuthBox; import org.apache.fop.layoutmgr.KnuthElement; import org.apache.fop.layoutmgr.KnuthPenalty; 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.NonLeafPosition; import org.apache.fop.layoutmgr.Position; import org.apache.fop.layoutmgr.PositionIterator; @@ -279,8 +280,7 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager int keepWithNextActive = BlockLevelLayoutManager.KEEP_AUTO; LinkedList returnList = new LinkedList(); - while ((step = getNextStep(elementLists, start, end, partialHeights)) - > 0) { + while ((step = getNextStep(elementLists, start, end, partialHeights)) > 0) { if (end[0] + 1 == elementLists[0].size()) { keepWithNextActive = Math.max(keepWithNextActive, keepWithNextPendingOnLabel); @@ -312,11 +312,33 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager int boxHeight = step - addedBoxHeight - penaltyHeight; penaltyHeight += additionalPenaltyHeight; //Add AFTER calculating boxHeight! + // collect footnote information + // TODO this should really not be done like this. ListItemLM should remain as + // footnote-agnostic as possible + LinkedList footnoteList = null; + ListElement el; + 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(); + } + footnoteList.addAll(((KnuthBlockBox) el).getFootnoteBodyLMs()); + } + } + } + // add the new elements addedBoxHeight += boxHeight; ListItemPosition stepPosition = new ListItemPosition(this, start[0], end[0], start[1], end[1]); - returnList.add(new KnuthBox(boxHeight, stepPosition, false)); + if (footnoteList == null) { + returnList.add(new KnuthBox(boxHeight, stepPosition, false)); + } else { + returnList.add(new KnuthBlockBox(boxHeight, footnoteList, stepPosition, false)); + } + if (addedBoxHeight < totalHeight) { int strength = BlockLevelLayoutManager.KEEP_AUTO; strength = Math.max(strength, keepWithNextActive); diff --git a/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java b/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java index feb4b67ac..4012b0c00 100644 --- a/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java +++ b/src/java/org/apache/fop/layoutmgr/table/ActiveCell.java @@ -19,12 +19,12 @@ package org.apache.fop.layoutmgr.table; +import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.apache.fop.fo.Constants; import org.apache.fop.fo.flow.table.ConditionalBorder; import org.apache.fop.fo.flow.table.EffRow; @@ -32,6 +32,7 @@ import org.apache.fop.fo.flow.table.PrimaryGridUnit; import org.apache.fop.fo.properties.CommonBorderPaddingBackground; import org.apache.fop.layoutmgr.BlockLevelLayoutManager; import org.apache.fop.layoutmgr.ElementListUtils; +import org.apache.fop.layoutmgr.KnuthBlockBox; import org.apache.fop.layoutmgr.KnuthBox; import org.apache.fop.layoutmgr.KnuthElement; import org.apache.fop.layoutmgr.KnuthPenalty; @@ -101,6 +102,8 @@ class ActiveCell { private int penaltyLength; /** Value of the penalty ending this step, 0 if the step does not end on a penalty. */ private int penaltyValue; + /** List of footnotes for this step. */ + private List footnoteList; /** * One of {@link Constants#EN_AUTO}, {@link Constants#EN_COLUMN}, * {@link Constants#EN_PAGE}, {@link Constants#EN_EVEN_PAGE}, @@ -130,6 +133,7 @@ class ActiveCell { this.totalLength = other.totalLength; this.penaltyLength = other.penaltyLength; this.penaltyValue = other.penaltyValue; + this.footnoteList = other.footnoteList; this.condBeforeContentLength = other.condBeforeContentLength; this.breakClass = other.breakClass; } @@ -293,6 +297,7 @@ class ActiveCell { afterNextStep.penaltyValue = 0; afterNextStep.condBeforeContentLength = 0; afterNextStep.breakClass = Constants.EN_AUTO; + afterNextStep.footnoteList = null; boolean breakFound = false; boolean prevIsBox = false; boolean boxFound = false; @@ -322,6 +327,12 @@ class ActiveCell { } prevIsBox = false; } else { + if (el instanceof KnuthBlockBox && ((KnuthBlockBox) el).hasAnchors()) { + if (afterNextStep.footnoteList == null) { + afterNextStep.footnoteList = new LinkedList(); + } + afterNextStep.footnoteList.addAll(((KnuthBlockBox) el).getFootnoteBodyLMs()); + } prevIsBox = true; boxFound = true; afterNextStep.contentLength += el.getW(); @@ -543,6 +554,18 @@ class ActiveCell { } } + /** + * Adds the footnotes (if any) that are part of the next step, if this cell + * contributes content to the next step. + * + * @param footnoteList the list to which this cell must add its footnotes + */ + void addFootnotes(List footnoteList) { + if (includedInLastStep() && nextStep.footnoteList != null) { + footnoteList.addAll(nextStep.footnoteList); + } + } + int getKeepWithNextStrength() { return keepWithNextStrength; } diff --git a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java index f514844ac..7c963338f 100644 --- a/src/java/org/apache/fop/layoutmgr/table/TableStepper.java +++ b/src/java/org/apache/fop/layoutmgr/table/TableStepper.java @@ -33,6 +33,7 @@ import org.apache.fop.fo.flow.table.PrimaryGridUnit; import org.apache.fop.layoutmgr.BlockLevelLayoutManager; import org.apache.fop.layoutmgr.BreakElement; import org.apache.fop.layoutmgr.KeepUtil; +import org.apache.fop.layoutmgr.KnuthBlockBox; import org.apache.fop.layoutmgr.KnuthBox; import org.apache.fop.layoutmgr.KnuthElement; import org.apache.fop.layoutmgr.KnuthGlue; @@ -199,12 +200,14 @@ public class TableStepper { } } + LinkedList footnoteList = new LinkedList(); //Put all involved grid units into a list List cellParts = new java.util.ArrayList(columnCount); for (Iterator iter = activeCells.iterator(); iter.hasNext();) { ActiveCell activeCell = (ActiveCell) iter.next(); CellPart part = activeCell.createCellPart(); cellParts.add(part); + activeCell.addFootnotes(footnoteList); } //Create elements for step @@ -217,7 +220,13 @@ public class TableStepper { tcpos.setFlag(TableContentPosition.FIRST_IN_ROWGROUP, true); } lastTCPos = tcpos; - returnList.add(new KnuthBox(boxLen, tcpos, false)); + + // TODO TableStepper should remain as footnote-agnostic as possible + if (footnoteList.isEmpty()) { + returnList.add(new KnuthBox(boxLen, tcpos, false)); + } else { + returnList.add(new KnuthBlockBox(boxLen, footnoteList, tcpos, false)); + } int effPenaltyLen = Math.max(0, penaltyOrGlueLen); TableHFPenaltyPosition penaltyPos = new TableHFPenaltyPosition(getTableLM()); diff --git a/test/layoutengine/disabled-testcases.xml b/test/layoutengine/disabled-testcases.xml index 476db249e..ba985bf8d 100644 --- a/test/layoutengine/disabled-testcases.xml +++ b/test/layoutengine/disabled-testcases.xml @@ -98,24 +98,6 @@ regions.</description> </testcase> <testcase> - <name>Footnotes swallowed in lists</name> - <file>footnote_in_list.xml</file> - <description>Element lists for lists are created by combining the - element lists from list-item-label and list-item-body. The - footnotes contained in the KnuthBlockBoxes are not propagated to - the combined element list.</description> - <reference>http://issues.apache.org/bugzilla/show_bug.cgi?id=37579</reference> - </testcase> - <testcase> - <name>Footnotes swallowed in tables</name> - <file>footnote_in_table.xml</file> - <description>Element lists for tables are created by combining the - element lists from the individual table-cells. The footnotes - contained in the KnuthBlockBoxes are not propagated to the combined - element list.</description> - <reference>http://issues.apache.org/bugzilla/show_bug.cgi?id=37579</reference> - </testcase> - <testcase> <name>NPE for table inside an inline</name> <file>inline_block_nested_3.xml</file> <description>Placing a table as a child of an fo:inline produces a diff --git a/test/layoutengine/standard-testcases/footnote_in_list.xml b/test/layoutengine/standard-testcases/footnote_in_list.xml index 13bfa2ba4..716f07fc8 100644 --- a/test/layoutengine/standard-testcases/footnote_in_list.xml +++ b/test/layoutengine/standard-testcases/footnote_in_list.xml @@ -65,5 +65,7 @@ </fo> <checks> <eval expected="2" xpath="count(//footnote/block)"/> + <eval expected="1) The footnote from the normal block." xpath="//footnote/block[1]"/> + <eval expected="2) The footnote from the list." xpath="//footnote/block[2]"/> </checks> </testcase> diff --git a/test/layoutengine/standard-testcases/footnote_in_list_2.xml b/test/layoutengine/standard-testcases/footnote_in_list_2.xml new file mode 100644 index 000000000..a0e477d57 --- /dev/null +++ b/test/layoutengine/standard-testcases/footnote_in_list_2.xml @@ -0,0 +1,125 @@ +<?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> + This test checks footnotes as descendants of list-item-body elements. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> + <fo:layout-master-set> + <fo:simple-page-master master-name="simple" page-height="220pt" page-width="3in" + margin="10pt"> + <fo:region-body background-color="#F0F0F0"/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="simple" font-size="8pt" line-height="10pt"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>Before the list.</fo:block> + <fo:list-block provisional-distance-between-starts="1.2em" provisional-label-separation="2pt"> + <fo:list-item> + <fo:list-item-label end-indent="label-end()"> + <fo:block>–</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque<fo:footnote> + <fo:inline>(1)</fo:inline> + <fo:footnote-body> + <fo:block start-indent="0"> + <fo:inline>(1)</fo:inline> First footnote from the list.</fo:block> + </fo:footnote-body> + </fo:footnote> hendrerit euismod velit. Nulla facilisi. Etiam et risus at neque ultrices + facilisis. Donec lectus est, nonummy quis, rhoncus bibendum, porta at, nisl<fo:footnote> + <fo:inline>(2)</fo:inline> + <fo:footnote-body> + <fo:block start-indent="0"> + <fo:inline>(2)</fo:inline> Second footnote from the list.</fo:block> + </fo:footnote-body> + </fo:footnote>. + </fo:block> + </fo:list-item-body> + </fo:list-item> + <fo:list-item> + <fo:list-item-label end-indent="label-end()"> + <fo:block>–</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque<fo:footnote> + <fo:inline>(3)</fo:inline> + <fo:footnote-body> + <fo:block start-indent="0"> + <fo:inline>(3)</fo:inline> Third footnote from the list.</fo:block> + </fo:footnote-body> + </fo:footnote> hendrerit euismod velit. Nulla facilisi. Etiam et risus at neque ultrices + facilisis. Donec lectus est, nonummy quis, rhoncus bibendum, porta at, nisl<fo:footnote> + <fo:inline>(4)</fo:inline> + <fo:footnote-body> + <fo:block start-indent="0"> + <fo:inline>(4)</fo:inline> Fourth footnote from the list.</fo:block> + </fo:footnote-body> + </fo:footnote>. + </fo:block> + </fo:list-item-body> + </fo:list-item> + </fo:list-block> + </fo:flow> + </fo:page-sequence> + <fo:page-sequence master-reference="simple" font-size="8pt" line-height="10pt"> + <fo:flow flow-name="xsl-region-body"> + <fo:block space-after="130pt">Before the list.</fo:block> + <fo:list-block provisional-distance-between-starts="1.2em" provisional-label-separation="2pt"> + <fo:list-item> + <fo:list-item-label end-indent="label-end()"> + <fo:block>–</fo:block> + </fo:list-item-label> + <fo:list-item-body start-indent="body-start()"> + <fo:block orphans="1" widows="1">Lorem ipsum dolor sit amet, consectetuer adipiscing + elit. Pellentesque<fo:footnote> + <fo:inline>(1)</fo:inline> + <fo:footnote-body> + <fo:block start-indent="0">(1) First footnote from the list.</fo:block> + </fo:footnote-body> + </fo:footnote> hendrerit euismod velit. Nulla facilisi. Etiam et risus at neque ultrices + facilisis. Donec lectus est, nonummy quis, rhoncus bibendum, porta at, nisl<fo:footnote> + <fo:inline>(2)</fo:inline> + <fo:footnote-body> + <fo:block start-indent="0">(2) Second footnote from the list.</fo:block> + </fo:footnote-body> + </fo:footnote>. + </fo:block> + </fo:list-item-body> + </fo:list-item> + </fo:list-block> + </fo:flow> + </fo:page-sequence> + </fo:root> + </fo> + <checks> + <eval expected="4" xpath="count(//pageSequence[1]//footnote/block)"/> + <eval expected="(1) First footnote from the list." xpath="//pageSequence[1]//footnote/block[1]"/> + <eval expected="(2) Second footnote from the list." xpath="//pageSequence[1]//footnote/block[2]"/> + <eval expected="(3) Third footnote from the list." xpath="//pageSequence[1]//footnote/block[3]"/> + <eval expected="(4) Fourth footnote from the list." xpath="//pageSequence[1]//footnote/block[4]"/> + <eval expected="1" xpath="count(//pageSequence[2]/pageViewport[1]//footnote/block)"/> + <eval expected="(1) First footnote from the list." xpath="//pageSequence[2]/pageViewport[1]//footnote/block"/> + <eval expected="1" xpath="count(//pageSequence[2]/pageViewport[2]//footnote/block)"/> + <eval expected="(2) Second footnote from the list." xpath="//pageSequence[2]/pageViewport[2]//footnote/block"/> + </checks> +</testcase> diff --git a/test/layoutengine/standard-testcases/footnote_in_table.xml b/test/layoutengine/standard-testcases/footnote_in_table.xml index 5011b48c6..d9e252ce6 100644 --- a/test/layoutengine/standard-testcases/footnote_in_table.xml +++ b/test/layoutengine/standard-testcases/footnote_in_table.xml @@ -69,5 +69,7 @@ </fo> <checks> <eval expected="2" xpath="count(//footnote/block)"/> + <eval expected="1) The footnote from the normal block." xpath="//footnote/block[1]"/> + <eval expected="2) The footnote from the table." xpath="//footnote/block[2]"/> </checks> </testcase> diff --git a/test/layoutengine/standard-testcases/footnote_in_table_2.xml b/test/layoutengine/standard-testcases/footnote_in_table_2.xml new file mode 100644 index 000000000..f0514a889 --- /dev/null +++ b/test/layoutengine/standard-testcases/footnote_in_table_2.xml @@ -0,0 +1,185 @@ +<?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> + This test checks footnotes as descendants of table-body elements. + </p> + </info> + <fo> + <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> + <fo:layout-master-set> + <fo:simple-page-master master-name="simple" page-height="220pt" page-width="3in" + margin="10pt"> + <fo:region-body background-color="#F0F0F0"/> + </fo:simple-page-master> + </fo:layout-master-set> + <fo:page-sequence master-reference="simple" 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-body border="1pt solid black"> + <fo:table-row border="inherit"> + <fo:table-cell border="inherit" number-rows-spanned="2"> + <fo:block>Cell 1.1</fo:block> + <fo:block>Cell 1.1</fo:block> + <fo:block>Cell 1.1<fo:footnote> + <fo:inline>(2)</fo:inline> + <fo:footnote-body> + <fo:block>(2) Second footnote from the table.</fo:block> + </fo:footnote-body> + </fo:footnote></fo:block> + <fo:block>Cell 1.1</fo:block> + </fo:table-cell> + <fo:table-cell border="inherit"> + <fo:block>Cell 1.2</fo:block> + <fo:block>Cell 1.2<fo:footnote> + <fo:inline>(1)</fo:inline> + <fo:footnote-body> + <fo:block>(1) First footnote from the table.</fo:block> + </fo:footnote-body> + </fo:footnote>. + </fo:block> + </fo:table-cell> + </fo:table-row> + <fo:table-row border="inherit"> + <fo:table-cell> + <fo:block>Cell<fo:footnote> + <fo:inline>(3)</fo:inline> + <fo:footnote-body> + <fo:block>(3) Third footnote from the table.</fo:block> + </fo:footnote-body> + </fo:footnote> 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="simple" font-size="8pt" line-height="10pt"> + <fo:flow flow-name="xsl-region-body"> + <fo:block space-after="159pt">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-body border="1pt solid black"> + <fo:table-row border="inherit"> + <fo:table-cell border="inherit" number-rows-spanned="2"> + <fo:block>Cell 1.1</fo:block> + <fo:block>Cell 1.1</fo:block> + <fo:block>Cell 1.1<fo:footnote> + <fo:inline>(2)</fo:inline> + <fo:footnote-body> + <fo:block>(2) Second footnote from the table.</fo:block> + </fo:footnote-body> + </fo:footnote></fo:block> + <fo:block>Cell 1.1</fo:block> + </fo:table-cell> + <fo:table-cell border="inherit"> + <fo:block>Cell 1.2</fo:block> + <fo:block>Cell 1.2<fo:footnote> + <fo:inline>(1)</fo:inline> + <fo:footnote-body> + <fo:block>(1) First footnote from the table.</fo:block> + </fo:footnote-body> + </fo:footnote>. + </fo:block> + </fo:table-cell> + </fo:table-row> + <fo:table-row border="inherit"> + <fo:table-cell> + <fo:block>Cell<fo:footnote> + <fo:inline>(3)</fo:inline> + <fo:footnote-body> + <fo:block>(3) Third footnote from the table.</fo:block> + </fo:footnote-body> + </fo:footnote> 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="simple" font-size="8pt" line-height="10pt"> + <fo:flow flow-name="xsl-region-body"> + <fo:block space-after="139pt">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-body border="1pt solid black"> + <fo:table-row border="inherit"> + <fo:table-cell border="inherit" number-rows-spanned="2"> + <fo:block>Cell 1.1</fo:block> + <fo:block>Cell 1.1</fo:block> + <fo:block>Cell 1.1<fo:footnote> + <fo:inline>(2)</fo:inline> + <fo:footnote-body> + <fo:block>(2) Second footnote from the table.</fo:block> + </fo:footnote-body> + </fo:footnote></fo:block> + <fo:block>Cell 1.1</fo:block> + </fo:table-cell> + <fo:table-cell border="inherit"> + <fo:block>Cell 1.2</fo:block> + <fo:block>Cell 1.2<fo:footnote> + <fo:inline>(1)</fo:inline> + <fo:footnote-body> + <fo:block>(1) First footnote from the table.</fo:block> + </fo:footnote-body> + </fo:footnote>. + </fo:block> + </fo:table-cell> + </fo:table-row> + <fo:table-row border="inherit"> + <fo:table-cell> + <fo:block>Cell<fo:footnote> + <fo:inline>(3)</fo:inline> + <fo:footnote-body> + <fo:block>(3) Third footnote from the table.</fo:block> + </fo:footnote-body> + </fo:footnote> 2.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="3" xpath="count(//pageSequence[1]//footnote/block)"/> + <eval expected="(1) First footnote from the table." xpath="//pageSequence[1]//footnote/block[1]"/> + <eval expected="(2) Second footnote from the table." xpath="//pageSequence[1]//footnote/block[2]"/> + <eval expected="(3) Third footnote from the table." xpath="//pageSequence[1]//footnote/block[3]"/> + + <eval expected="1" xpath="count(//pageSequence[2]/pageViewport[1]//footnote/block)"/> + <eval expected="(1) First footnote from the table." xpath="//pageSequence[2]/pageViewport[1]//footnote/block[1]"/> + <eval expected="2" xpath="count(//pageSequence[2]/pageViewport[2]//footnote/block)"/> + <eval expected="(2) Second footnote from the table." xpath="//pageSequence[2]/pageViewport[2]//footnote/block[1]"/> + <eval expected="(3) Third footnote from the table." xpath="//pageSequence[2]/pageViewport[2]//footnote/block[2]"/> + + <eval expected="2" xpath="count(//pageSequence[3]/pageViewport[1]//footnote/block)"/> + <eval expected="(1) First footnote from the table." xpath="//pageSequence[3]/pageViewport[1]//footnote/block[1]"/> + <eval expected="(2) Second footnote from the table." xpath="//pageSequence[3]/pageViewport[1]//footnote/block[2]"/> + <eval expected="1" xpath="count(//pageSequence[3]/pageViewport[2]//footnote/block)"/> + <eval expected="(3) Third footnote from the table." xpath="//pageSequence[3]/pageViewport[2]//footnote/block[1]"/> + </checks> +</testcase> |