按xsl:fo表中的列行值分组

问题描述 投票:0回答:1

我正在尝试将xsl fo:table中各个列的值分组,某些值未按预期分组,而是根据上一列的分组值进行分组,

enter image description here

我需要在列中进行单独分组,请检查我的xsl和xml文件,我正在使用这些文件通过apache FOP生成PDF文件。

我的XSL文件

<?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"
        xmlns:fo="http://www.w3.org/1999/XSL/Format"
        exclude-result-prefixes="#all"
        version="3.0">

      <xsl:output method="xml" indent="yes"/>

        <xsl:template match="data">
            <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
                <fo:layout-master-set>
                    <fo:simple-page-master master-name="simple"
                        page-height="8.5in" page-width="11in" margin-top=".5in"
                        margin-bottom=".5in" margin-left=".5in" margin-right=".5in">
                        <fo:region-body margin-top="2cm" margin-bottom="2cm" />
                        <fo:region-before extent="2cm" overflow="hidden" />
                        <fo:region-after extent="1cm" overflow="hidden" />
                    </fo:simple-page-master>
                </fo:layout-master-set>
                <fo:page-sequence master-reference="simple"
                    initial-page-number="1">
                    <fo:static-content flow-name="xsl-region-before">
                        <fo:block font-size="13.0pt" font-family="serif"
                            padding-after="2.0pt" space-before="4.0pt" text-align="center"
                            border-bottom-style="solid" border-bottom-width="1.0pt">
                            <xsl:text>PDF Test</xsl:text>
                        </fo:block>
                    </fo:static-content>
                    <fo:static-content flow-name="xsl-region-after">
                        <fo:block font-size="12.0pt" font-family="sans-serif"
                            padding-after="2.0pt" space-before="2.0pt" text-align="center"
                            border-top-style="solid" border-bottom-width="1.0pt">
                            <xsl:text>Page</xsl:text>
                            <fo:page-number />
                        </fo:block>
                    </fo:static-content>
                    <fo:flow flow-name="xsl-region-body">
                        <xsl:apply-templates select="data-body" />
                    </fo:flow>
                </fo:page-sequence>
            </fo:root>
        </xsl:template>
        <xsl:template match="data-body">
            <fo:block text-align="center">
                <fo:table table-layout="fixed" width="100%"
                    border-style="dashed">
                    <fo:table-column border-style="solid" />
                    <fo:table-column border-style="solid" />
                    <fo:table-column border-style="solid" />
                    <fo:table-header>
                        <xsl:apply-templates select="table-header" />
                    </fo:table-header>
                    <fo:table-body>
                        <xsl:for-each-group select="table-data" group-adjacent="column-two">
                            <xsl:apply-templates select="current-group()">
                                <xsl:with-param name="row-span" select="count(current-group())" tunnel="yes"/>
                            </xsl:apply-templates>
                        </xsl:for-each-group>
                    </fo:table-body>
                </fo:table>
            </fo:block>
        </xsl:template>

        <xsl:template match="table-header">
            <fo:table-row keep-together.within-page="always"
                border-style="solid">
                <fo:table-cell>
                    <fo:block font-size="10pt" font-family="sans-serif"
                        padding-top="3pt">
                        <xsl:value-of select="column-one"></xsl:value-of>
                    </fo:block>
                </fo:table-cell>
                <fo:table-cell>
                    <fo:block font-size="10pt" font-family="sans-serif"
                        padding-top="3pt">
                        <xsl:value-of select="column-two"></xsl:value-of>
                    </fo:block>
                </fo:table-cell>
                <fo:table-cell>
                    <fo:block font-size="10pt" font-family="sans-serif"
                        padding-top="3pt">
                        <xsl:value-of select="column-three"></xsl:value-of>
                    </fo:block>
                </fo:table-cell>
            </fo:table-row>
        </xsl:template>

        <xsl:template match="table-data">
            <fo:table-row keep-together.within-page="always"
                border-style="solid">
                <xsl:apply-templates>
                    <xsl:with-param name="row-group-index" tunnel="yes" select="position()"/>
                </xsl:apply-templates>
            </fo:table-row>
        </xsl:template>

        <xsl:template match="table-data/*">
            <fo:table-cell>
                <fo:block font-size="10pt" font-family="sans-serif"
                    padding-top="3pt">
                    <xsl:value-of select="."></xsl:value-of>
                </fo:block>
            </fo:table-cell>
        </xsl:template>

        <xsl:template match="table-data/column-two">
            <xsl:param name="row-span" tunnel="yes"/>
            <xsl:param name="row-group-index" tunnel="yes"/>
            <xsl:choose>
                <xsl:when test="$row-span = 1">
                    <xsl:next-match/>
                </xsl:when>
                <xsl:when test="$row-span > 1 and $row-group-index = 1">
                    <fo:table-cell number-rows-spanned="{$row-span}">
                        <fo:block font-size="10pt" font-family="sans-serif"
                            padding-top="3pt">
                            <xsl:value-of select="."></xsl:value-of>
                        </fo:block>
                    </fo:table-cell>                
                </xsl:when>
            </xsl:choose>
        </xsl:template>

        <xsl:template match="table-data/column-three">
            <xsl:param name="row-span" tunnel="yes"/>
            <xsl:param name="row-group-index" tunnel="yes"/>
            <xsl:choose>
                <xsl:when test="$row-span = 1">
                    <xsl:next-match/>
                </xsl:when>
                <xsl:when test="$row-span > 1 and $row-group-index = 1">
                    <fo:table-cell number-rows-spanned="{$row-span}">
                        <fo:block font-size="10pt" font-family="sans-serif"
                            padding-top="3pt">
                            <xsl:value-of select="."></xsl:value-of>
                        </fo:block>
                    </fo:table-cell>                
                </xsl:when>
            </xsl:choose>
        </xsl:template>
</xsl:stylesheet>

我的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<data>
<data-body>
    <table-header>
        <column-one>Column One</column-one>
        <column-two>Column Two</column-two>
        <column-three>Column Three</column-three>
    </table-header>
    <table-data>
        <column-one>One</column-one>
        <column-two>5000</column-two>
        <column-three>Three</column-three>
    </table-data>
    <table-data>
        <column-one>One</column-one>
        <column-two>5000</column-two>
        <column-three>Three</column-three>
    </table-data>
    <table-data>
        <column-one>One</column-one>
        <column-two>1200</column-two>
        <column-three>Three</column-three>
    </table-data>
    <table-data>
        <column-one>One</column-one>
        <column-two>2000</column-two>
        <column-three>Four</column-three>
    </table-data>
    <table-data>
        <column-one>One</column-one>
        <column-two>2000</column-two>
        <column-three>Four</column-three>
    </table-data>
    <table-data>
        <column-one>One</column-one>
        <column-two>1234</column-two>
        <column-three>Five</column-three>
    </table-data>
    <table-data>
        <column-one>One</column-one>
        <column-two>5666</column-two>
        <column-three>Five</column-three>
    </table-data>
    <table-data>
        <column-one>One</column-one>
        <column-two>5666</column-two>
        <column-three>Five</column-three>
    </table-data>
     </data-body>
</data>
xslt pdf-generation xsl-fo apache-fop
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.