2013-03-19 4 views
1

Для следующего XML-файла мне нужно сгенерировать файл xsl-fo, который будет преобразован в pdf.XSLT Генерировать динамические строки и столбцы для Apache FOP

Я новичок в таблицах стилей и изо всех сил пытаюсь создать динамический стол. Пожалуйста помоги.

Кроме того, ширина для каждого столбца изменяется в зависимости от столбца. Как я могу включить это в код?

Значения столбцов и столбцов столбца динамически заполняются в XML-файле. Ниже приведен образец.

Может кто-нибудь помочь в создании кода xsl-fo или xslt?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ReportData> 

    <ColumnHeaders> 
     <ColumnHeader> 
      <Name>Col-Header1</Name> 
      <Width>5</Length> 
     </ColumnHeader> 
     <ColumnHeader> 
      <Name>Col-Header2</Name> 
      <Width>10</Length> 
     </ColumnHeader> 
     <ColumnHeader> 
      <Name>Col-Header3</Name> 
      <Width>8</Length> 
     </ColumnHeader> 
    </ColumnHeaders> 

<Rows> 
     <Row> 
      <Column>Row1-Col1</Column> 
      <Column>Row1-Col2</Column> 
      <Column>Row1-Col3</Column>    
     </Row> 
     <Row> 
      <Column>Row2-Col1</Column> 
      <Column>Row2-Col2</Column> 
      <Column>Row2-Col3</Column> 
     </Row> 
    </Rows> 
</ReportData> 

ответ

6

Это должно заставить вас начать. Я использовал cm для ширины столбца, а страница - 11 "x 8.5" (альбомная), чтобы таблица располагалась на странице. Это должно быть легко изменить.

XML-вход (фиксированная быть хорошо сформированы)

<ReportData> 

    <ColumnHeaders> 
     <ColumnHeader> 
      <Name>Col-Header1</Name> 
      <Width>5</Width> 
     </ColumnHeader> 
     <ColumnHeader> 
      <Name>Col-Header2</Name> 
      <Width>10</Width> 
     </ColumnHeader> 
     <ColumnHeader> 
      <Name>Col-Header3</Name> 
      <Width>8</Width> 
     </ColumnHeader> 
    </ColumnHeaders> 

    <Rows> 
     <Row> 
      <Column>Row1-Col1</Column> 
      <Column>Row1-Col2</Column> 
      <Column>Row1-Col3</Column>    
     </Row> 
     <Row> 
      <Column>Row2-Col1</Column> 
      <Column>Row2-Col2</Column> 
      <Column>Row2-Col3</Column> 
     </Row> 
    </Rows> 
</ReportData> 

XSLT-1,0

<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 indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
     <fo:root> 
      <fo:layout-master-set> 
       <fo:simple-page-master master-name="my-page" page-height="8.5in" page-width="11in"> 
        <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/> 
       </fo:simple-page-master> 
      </fo:layout-master-set> 
      <fo:page-sequence master-reference="my-page"> 
       <fo:flow flow-name="xsl-region-body"> 
        <xsl:apply-templates/> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 

    <xsl:template match="ReportData"> 
     <fo:table> 
      <fo:table-header> 
       <fo:table-row> 
        <xsl:apply-templates select="ColumnHeaders/ColumnHeader"/>     
       </fo:table-row> 
      </fo:table-header> 
      <fo:table-body> 
       <xsl:apply-templates select="Rows/Row"/> 
      </fo:table-body> 
     </fo:table> 
    </xsl:template> 

    <xsl:template match="ColumnHeader"> 
     <fo:table-cell width="{Width}cm" border="solid black 1px" padding="2px" font-weight="bold" text-align="center"> 
      <fo:block><xsl:value-of select="Name"/></fo:block> 
     </fo:table-cell> 
    </xsl:template> 

    <xsl:template match="Row"> 
     <fo:table-row> 
      <xsl:apply-templates/> 
     </fo:table-row> 
    </xsl:template> 

    <xsl:template match="Column"> 
     <fo:table-cell border="solid black 1px" padding="2px"> 
      <fo:block><xsl:value-of select="."/></fo:block> 
     </fo:table-cell> 
    </xsl:template>  

</xsl:stylesheet> 

XSL-FO Выход

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page" page-height="8.5in" page-width="11in"> 
     <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/> 
     </fo:simple-page-master> 
    </fo:layout-master-set> 
    <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body"> 
     <fo:table> 
      <fo:table-header> 
       <fo:table-row> 
        <fo:table-cell width="5cm" 
           border="solid black 1px" 
           padding="2px" 
           font-weight="bold" 
           text-align="center"> 
        <fo:block>Col-Header1</fo:block> 
        </fo:table-cell> 
        <fo:table-cell width="10cm" 
           border="solid black 1px" 
           padding="2px" 
           font-weight="bold" 
           text-align="center"> 
        <fo:block>Col-Header2</fo:block> 
        </fo:table-cell> 
        <fo:table-cell width="8cm" 
           border="solid black 1px" 
           padding="2px" 
           font-weight="bold" 
           text-align="center"> 
        <fo:block>Col-Header3</fo:block> 
        </fo:table-cell> 
       </fo:table-row> 
      </fo:table-header> 
      <fo:table-body> 
       <fo:table-row> 
        <fo:table-cell border="solid black 1px" padding="2px"> 
        <fo:block>Row1-Col1</fo:block> 
        </fo:table-cell> 
        <fo:table-cell border="solid black 1px" padding="2px"> 
        <fo:block>Row1-Col2</fo:block> 
        </fo:table-cell> 
        <fo:table-cell border="solid black 1px" padding="2px"> 
        <fo:block>Row1-Col3</fo:block> 
        </fo:table-cell> 
       </fo:table-row> 
       <fo:table-row> 
        <fo:table-cell border="solid black 1px" padding="2px"> 
        <fo:block>Row2-Col1</fo:block> 
        </fo:table-cell> 
        <fo:table-cell border="solid black 1px" padding="2px"> 
        <fo:block>Row2-Col2</fo:block> 
        </fo:table-cell> 
        <fo:table-cell border="solid black 1px" padding="2px"> 
        <fo:block>Row2-Col3</fo:block> 
        </fo:table-cell> 
       </fo:table-row> 
      </fo:table-body> 
     </fo:table> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 

PDF Выход

enter image description here

+0

Большое спасибо. Отлично работает – user2183430

+1

@ user2183430 - Тебе очень рады. Примите этот ответ, установив флажок рядом с ним. Благодаря! –

+0

Я получил таблицу, отображаемую в формате PDF. У меня еще есть еще одна проблема для решения. Страница PDF имеет ограничение в 120 символов. Заголовки столбцов и значения столбцов имеют неиспользуемое пустое пространство, что позволяет отображать меньше символов. Просьба предложить определить ширину столбцов таблицы для хранения только текста и без пустых/неиспользуемых пробелов. – user2183430

Смежные вопросы