2013-03-29 3 views
3

У меня довольно сложная таблица, которая, по моему мнению, является источником моей проблемы. Таблица заполняется на основе данных, полученных из файла XML из клиентской базы данных. Вот отрывок кода XSL, что я пытаюсь применить к XML:Как сохранить разрывы страниц из групп строк таблицы в XSL-FO

<fo:table-row> 
    <fo:table-cell number-columns-spanned="2"> 
     <fo:block/> 
    </fo:table-cell> 
    <fo:table-cell number-columns-spanned="2"> 
     <fo:block/> 
    </fo:table-cell> 
</fo:table-row> 
<xsl:for-each select="xml/value"> 
    <fo:table-row> 
     <fo:table-cell number-columns-spanned="2"> 
      <fo:block> 
       <xsl:value-of select="@value"/>/> 
      </fo:block> 
     </fo:table-cell> 
     <fo:table-cell number-columns-spanned="2"> 
      <fo:block> 
       <xsl:value-of select="@othervalue"/>/> 
      </fo:block> 
     </fo:table-cell> 
     </fo:table-row> 
</xsl:for-each> 

Это поставляемым вместе и обрабатывают, как в одной строке, так что если страница расщепляется где-то в этом большом ряду, это выглядит подобно тому, как строка разбивается.

Я пробовал использовать keep-together.within-page = "always", page-break-inside = "avoid", keep-with-previous.within-page = "always" и keep-with- next.within-page = «всегда» на столе и на итерированных блоках в разных комбинациях, но ничто, кажется, не застрянет. Может ли кто-нибудь найти решение для этого? Любая помощь приветствуется, спасибо.

ответ

1

Обходной путь для этого, который я (неохотно) использовал, представляет собой вложенные таблицы. С помощью этого решения (если оно работает для вас), лучше всего использовать table-layout="fixed" в таблицах и явно указывать столбцы и их ширину, чтобы убедиться, что столбцы выстроены в линию. Поэтому я бы предложил некоторые дополнительные шаблоны для того, чтобы немного поменять порядок и поддерживать:

<xsl:template match="Whatever"> 
    <fo:table table-layout="fixed"> 
     <xsl:call-template name="fourColumnTemplate"/> 
     <fo:table-body> 
      <!-- UNSEEN ROWS HERE --> 
      <!-- UNSEEN ROWS HERE --> 
      <!-- UNSEEN ROWS HERE --> 
      <fo:table-row keep-together.within-page="always"> 
       <fo:table-cell number-columns-spanned="4"> 
        <fo:block> 
         <xsl:call-template name="outputXmlValueTable"> 
          <xsl:with-param name="xmlNodes" select="xml/value"/> 
         </xsl:call-template> 
        </fo:block> 
       </fo:table-cell> 
      </fo:table-row> 
     </fo:table-body> 
    </fo:table> 
</xsl:template> 

<xsl:template name="fourColumnTemplate"> 
    <!-- note that these values should only be specified in one place for maintenance reasons --> 
    <fo:table-column column-width="proportional-column-width(2)"/> 
    <fo:table-column column-width="proportional-column-width(3)"/> 
    <fo:table-column column-width="proportional-column-width(2)"/> 
    <fo:table-column column-width="proportional-column-width(3)"/> 
</xsl:template> 

<xsl:template name="outputXmlValueTable"> 
    <xsl:param name="xmlNodes"/> 
    <fo:table table-layout="fixed"> 
     <xsl:call-template name="fourColumnTemplate"/> 
     <fo:table-header> 
      <fo:table-row> 
       <fo:table-cell number-columns-spanned="2"> 
        <fo:block>Title1</fo:block> 
       </table-cell> 
       <fo:table-cell number-columns-spanned="2"> 
        <fo:block>Title2</fo:block> 
       </table-cell> 
      </fo:table-row> 
     </fo:table-header> 
     <fo:table-body> 
      <xsl:apply-templates select="$xmlNodes" mode="outputXmlValueRow"/> 
     </fo:table-body> 
    </fo:table> 
</xsl:template> 

<xsl:template match="*" mode="outputXmlValueRow"> 
    <fo:table-row> 
     <fo:table-cell number-columns-spanned="2"> 
      <fo:block> 
       <xsl:value-of select="@value"/>/> 
      </fo:block> 
     </fo:table-cell> 
     <fo:table-cell number-columns-spanned="2"> 
      <fo:block> 
       <xsl:value-of select="@othervalue"/>/> 
      </fo:block> 
     </fo:table-cell> 
    </fo:table-row> 
</xsl:template>