Если вы знаете, что не более 18 заказов, вы можете использовать что-то вроде этого:
<xsl:if test="Order">
<tableRow>
<xsl:apply-templates select="Order[position() <= 6]" />
</tableRow>
<xsl:if test="Order[7]">
<tableRow>
<xsl:apply-templates select="Order[position() <= 12 and position() > 6]" />
</tableRow>
<xsl:if test="Order[13]">
<tableRow>
<xsl:apply-templates select="Order[position() <= 18 and position() > 12]" />
</tableRow>
</xsl:if>
</xsl:if>
</xsl:if>
и затем у вас есть шаблон, который соответствует "Order"
и выводит ячейку таблицы.
Не очень элегантно, но легко.
Обновление:
ОК, выяснилось, что вышесказанное не было тем, что хотел ОП.
Ниже приведено частичное решение перефразированного вопроса. Отказ от ответственности:
Я не знаю FO, поэтому я оставляю эту часть как псевдокод. Судя по названию вопроса, я предполагаю, что часть, с которой вы хотите помочь, это просто XSLT.
Не будучи уверенным в том, что вам нужны ответы о структуре брутто страницы, о форматировании каждой ячейки или обоих, я обратился к первой, а не ко второй. Я не буду тратить время на последнее, если не услышу от вас, что это то, что вам нужно. Опять же, не зная FO, я не знаю, можете ли вы отформатировать содержимое каждой ячейки как встроенную таблицу, что было бы самым простым способом выстроить ее столбцы ...
В любом случае, вот частичное решение:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:variable name="rowsPerPage" select="6"/>
<xsl:variable name="columns" select="3"/>
<xsl:variable name="cellsPerPage" select="$rowsPerPage * $columns"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="workOrders">
<xsl:for-each-group select="workOrder"
group-by="position() idiv $cellsPerPage">
<!-- <page> is pseudocode for FO markup -->
<page>
<xsl:for-each-group select="current-group()"
group-by="position() idiv $columns">
<!-- <row> is pseudocode for FO markup -->
<row>
<xsl:apply-templates select="current-group()" mode="cell"/>
</row>
</xsl:for-each-group>
</page>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="workOrder" mode="cell">
<!-- <cell> is pseudocode for FO markup -->
<cell>
<!-- here goes code for laying out the address label -->
</cell>
</xsl:template>
</xsl:stylesheet>