2012-05-29 1 views
1

Добрый день, пожалуйста, сообщите. У меня есть список пунктов:Распечатайте список предметов в виде многоколоночной таблицы xsl-fo

<List> 
    <Item> 
    <Description>Item 1</Description> 
    <Code>0001</Code> 
    </Item> 
    <Item> 
    <Description>Item 2</Description> 
    <Code>0002</Code> 
    </Item> 
    <Item> 
    <Description>Item 3</Description> 
    <Code>0003</Code> 
    </Item> 
    <Item> 
    <Description>Item 4</Description> 
    <Code>0004</Code> 
    </Item> 
</List> 

я хотел бы, чтобы напечатать таблицу с 3-столбец, содержащий эти элементы, как это:

| Column 1 | Column 2 | Column 3 | 
================================== 
| Item 1 | Item 2 | Item 3 | 
---------------------------------- 
| Item 4 |   |   | 
---------------------------------- 

код ниже визуализирует ячейку таблицы для каждого элемента. Он не делает клетки для колонки 2 и 3 во втором ряду:

<fo:table> 
    <fo:table-column width="82mm"/> 
    <fo:table-column width="82mm"/> 
    <fo:table-column width="82mm"/> 
    <fo:table-body> 
    <xsl:for-each select="/List/Item[position() mod 3 = 1]"> 
     <fo:table-row><xsl:apply-templates select=". | following-sibling::*[3 > position()]"/></fo:table-row> 
    </xsl:for-each> 
    </fo:table-body> 
</fo:table> 

<xsl:template match="Item"> 
    <fo:table-cell><fo:block><xsl:value-of select="Description"/></fo:block></fo:table-cell> 
</xsl:template> 

Таблица затем отпечатанной так:

| Column 1 | Column 2 | Column 3 | 
================================== 
| Item 1 | Item 2 | Item 3 | 
---------------------------------- 
| Item 4 | 
------------ 

Есть элегантный способ, как вынести даже пустые ячейки таблицы, так что таблица выглядит полной? Я должен использовать FOP 0.95, xsl версии 1.0.

Спасибо заранее

Войтех

ответ

1

Надеюсь, что это даст вам представление о возможном решении:

Давайте этот простой XML-документ:

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

то это преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/*"> 
     <fo:table> 
      <fo:table-column width="82mm"/> 
      <fo:table-column width="82mm"/> 
      <fo:table-column width="82mm"/> 
      <fo:table-body> 
       <xsl:for-each select="*[position() mod 3 = 1]"> 
       <fo:table-row> 
        <xsl:apply-templates select= 
            ". | following-sibling::*[3 > position()]"/> 

         <xsl:variable name="vPos" select="position()"/> 
         <xsl:variable name="vUnfilled" 
          select=" 2 - count(following-sibling::*)"/> 
         <xsl:if test="position() = last()"> 
         <xsl:for-each select= 
            "../*[not(position() > $vUnfilled)]"> 
          <fo:table-cell> 
           <fo:block> 
            <xsl:value-of select="' '"/> 
           </fo:block> 
          </fo:table-cell> 
         </xsl:for-each> 
         </xsl:if> 
        </fo:table-row> 
       </xsl:for-each> 
      </fo:table-body> 
     </fo:table> 
    </xsl:template> 

    <xsl:template match="num"> 
     <fo:table-cell> 
      <fo:block> 
       <xsl:value-of select="."/> 
      </fo:block> 
     </fo:table-cell> 
    </xsl:template> 
</xsl:stylesheet> 

при нанесении на вышеуказанном документе XML, создает таблицу с полным хотел количеством ячеек для каждой строки:

<fo:table xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <fo:table-column width="82mm"/> 
    <fo:table-column width="82mm"/> 
    <fo:table-column width="82mm"/> 
    <fo:table-body> 
     <fo:table-row> 
     <fo:table-cell> 
      <fo:block>01</fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block>02</fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block>03</fo:block> 
     </fo:table-cell> 
     </fo:table-row> 
     <fo:table-row> 
     <fo:table-cell> 
      <fo:block>04</fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block>05</fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block>06</fo:block> 
     </fo:table-cell> 
     </fo:table-row> 
     <fo:table-row> 
     <fo:table-cell> 
      <fo:block>07</fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block>08</fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block>09</fo:block> 
     </fo:table-cell> 
     </fo:table-row> 
     <fo:table-row> 
     <fo:table-cell> 
      <fo:block>10</fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block> </fo:block> 
     </fo:table-cell> 
     <fo:table-cell> 
      <fo:block> </fo:block> 
     </fo:table-cell> 
     </fo:table-row> 
    </fo:table-body> 
</fo:table>