【问题标题】:XSLT Generate Dynamic Rows and Columns for Apache FOPXSLT 为 Apache FOP 生成动态行和列
【发布时间】:2013-03-19 21:25:10
【问题描述】:

对于下面的xml文件,我需要生成一个xsl-fo文件转成pdf。

我是样式表的新手,正在努力创建动态表。请帮忙。

此外,每列的宽度会有所不同,具体取决于列。我如何将其包含到代码中?

列标题和列值在 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>

【问题讨论】:

    标签: apache xslt xsl-fo apache-fop


    【解决方案1】:

    这应该可以帮助您入门。我使用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 输出

    【讨论】:

    • 非常感谢。完美运行
    • 我得到了 PDF 中显示的表格。我还有一个问题要解决。 PDF 页面有 120 个字符的限制。列标题和列值有未使用的空白,因此可以显示更少的字符。请建议如何定义表格列的宽度以仅包含文本且没有任何空白/未使用的空格。
    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多