Xml XSLT1.0中的动态样式表或基于条件的页面布局

Xml XSLT1.0中的动态样式表或基于条件的页面布局,xml,xslt,xslt-1.0,xsl-fo,Xml,Xslt,Xslt 1.0,Xsl Fo,我正在使用XSLT1.0创建PDF文档,其中我必须基于数据在页面上应用一些静态内容(“DAFT”),比如如果COMPLETED=0,然后打印“草稿” 在第页上,否则不会 我用来生成PDF的XML数据如下所示,数据将包含不同的客户,对于我在PDF中创建新页面(使用分页符)的每个客户,有时数据也会转到下一页 我尝试在创建新页面/应用分页符时实现静态内容,但问题是当数据溢出到下一页时,该静态内容不在下一页上,所以我认为这应该通过样式表来实现,我不知道如何实现 XML数据: <ROWSET1>

我正在使用XSLT1.0创建PDF文档,其中我必须基于数据在页面上应用一些静态内容(“DAFT”),比如如果COMPLETED=0,然后打印“草稿” 在第页上,否则不会

我用来生成PDF的XML数据如下所示,数据将包含不同的客户,对于我在PDF中创建新页面(使用分页符)的每个客户,有时数据也会转到下一页

我尝试在创建新页面/应用分页符时实现静态内容,但问题是当数据溢出到下一页时,该静态内容不在下一页上,所以我认为这应该通过样式表来实现,我不知道如何实现

XML数据:

<ROWSET1>
  <ROWSET1_ROW>
  <ID_INVOICE>9404</ID_INVOICE>
  <ID_CUSTOMER>371</ID_CUSTOMER>
  <COM_LASTNAME>XYZ Lmt</COM_LASTNAME>
  <SALUTATION>Company</SALUTATION>
  <RG_CONTACTTYPE>OU</RG_CONTACTTYPE>
  <NAME1>XYZ Lmt</NAME1>
  <NAME2>COM EMP</NAME2>
  <COMPLETED>0</COMPLETED>
  <DATE_INVOICE>31.05.2017</DATE_INVOICE>
  <INVOICE_YEAR>2017</INVOICE_YEAR>
  <INVOICENR>487</INVOICENR>
  <APPLICATION_NR>7.384.883</APPLICATION_NR>
  <NAME_CUST>EMP1</NAME_CUST>
  <SENT_DATE>15.05.2017</SENT_DATE>
  <ID_PRODUCT>3</ID_PRODUCT>
  <PRODUCTNAME>best product</PRODUCTNAME>
  <INVOICENR_ORDER>4053</INVOICENR_ORDER>
  <SUM_PRODUCT>168</SUM_PRODUCT>
  <IS_INDEP_CONTACT>N</IS_INDEP_CONTACT>
 </ROWSET1_ROW>
 <ROWSET1_ROW>
  <ID_INVOICE>9404</ID_INVOICE>
  <ID_CUSTOMER>371</ID_CUSTOMER>
  <COM_LASTNAME>XYZ Lmt</COM_LASTNAME>
  <SALUTATION>Company</SALUTATION>
  <RG_CONTACTTYPE>OU</RG_CONTACTTYPE>
  <NAME1>XYZ Lmt</NAME1>
  <NAME2>COM EMP</NAME2>
  <COMPLETED>0</COMPLETED>
  <DATE_INVOICE>31.05.2017</DATE_INVOICE>
  <INVOICE_YEAR>2017</INVOICE_YEAR>
  <INVOICENR>487</INVOICENR>
  <APPLICATION_NR>7.384.883</APPLICATION_NR>
  <NAME_CUST>EMP2</NAME_CUST>
  <SENT_DATE>15.05.2017</SENT_DATE>
  <ID_PRODUCT>3</ID_PRODUCT>
  <PRODUCTNAME>best product</PRODUCTNAME>
  <INVOICENR_ORDER>4053</INVOICENR_ORDER>
  <SUM_PRODUCT>168</SUM_PRODUCT>
  <IS_INDEP_CONTACT>N</IS_INDEP_CONTACT>
 </ROWSET1_ROW>
 <ROWSET1_ROW>
 ...
</ROWSET1>
<ROWSET2>
 <ROWSET2_ROW>
  <ID_CUSTOMER>371</ID_CUSTOMER>
  <ID_PRODUCT>3</ID_PRODUCT>
  <QUANTITY>290</QUANTITY>
  <APPLICATION_NR>1</APPLICATION_NR>
  <PRODUCTNAME>best product</PRODUCTNAME>
  <PRICE>168</PRICE>
 </ROWSET2_ROW>
 <ROWSET2_ROW>
  <ID_CUSTOMER>371</ID_CUSTOMER>
  <ID_PRODUCT>3</ID_PRODUCT>
  <QUANTITY>-12</QUANTITY>
  <APPLICATION_NR>4</APPLICATION_NR>
  <PRODUCTNAME>best product</PRODUCTNAME>
  <PRICE>168</PRICE>
 </ROWSET2_ROW>
 <ROWSET2_ROW>
  <ID_CUSTOMER>859</ID_CUSTOMER>
  <ID_PRODUCT>3</ID_PRODUCT>
  <QUANTITY>39</QUANTITY>
  <APPLICATION_NR>1</APPLICATION_NR>
  <PRODUCTNAME>best product</PRODUCTNAME>
  <PRICE>169</PRICE>
 </ROWSET2_ROW>
 <ROWSET2_ROW>
  <ID_CUSTOMER>859</ID_CUSTOMER>
  <ID_PRODUCT>3</ID_PRODUCT>
  <QUANTITY>-2</QUANTITY>
  <APPLICATION_NR>4</APPLICATION_NR>
  <PRODUCTNAME>best product</PRODUCTNAME>
  <PRICE>169</PRICE>
 </ROWSET2_ROW>
 ...
</ROWSET2>

9404
371
XYZ Lmt
单位
欧点
XYZ Lmt
电子商务
0
31.05.2017
2017
487
7.384.883
EMP1
15.05.2017
3.
最佳产品
4053
168
N
9404
371
XYZ Lmt
单位
欧点
XYZ Lmt
电子商务
0
31.05.2017
2017
487
7.384.883
EMP2
15.05.2017
3.
最佳产品
4053
168
N
...
371
3.
290
1.
最佳产品
168
371
3.
-12
4.
最佳产品
168
859
3.
39
1.
最佳产品
169
859
3.
-2
4.
最佳产品
169
...
样式表(stylesheet.xsl):


草稿
筹划
用于创建PDF的XSLT代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    xmlns:math="http://exslt.org/math" 
    xmlns:exslt="http://exslt.org/common"
    xmlns:str="http://exslt.org/strings"
    exclude-result-prefixes="exslt math str">

    <xsl:import href="stylesheet.xsl"/>

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:variable name="debug" select="false()"/>

    <xsl:variable name="dataRowset1" select="DOCUMENT/DATA/ROWSET1/ROWSET1_ROW"/>
    <xsl:param name="printheader" select="true()"/>

    <xsl:key name="key_cust_id" match="ROWSET1_ROW" use="ID_CUSTOMER"/>

    <!-- ###### Main template ###### -->
    <xsl:template match="/">
        <xsl:call-template name="paperlayout">
            <xsl:with-param name="draft" select="//ROWSET1/ROWSET1_ROW/COMPLETED =  0"/>
            <xsl:with-param name="printheader" select="$printheader"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:variable name="newline">
        <xsl:text>
        </xsl:text>
    </xsl:variable>


    <!--############## body ##############-->
    <xsl:template name="body">
        <xsl:apply-templates select="DOCUMENT/DATA" />
    </xsl:template>

    <xsl:template match="DATA">

        <xsl:variable name="dataRowset2" select="ROWSET2" />
        <!-- Status M check -->
        <xsl:if test="ROWSET1 != ''">

            <fo:block-container xsl:use-attribute-sets="section">

                <xsl:variable name="dataRowset1" select="ROWSET1" />

                <xsl:for-each select="//ROWSET1_ROW[generate-id(.)=generate-id(key('key_cust_id', ID_CUSTOMER)[1])]">
                    <xsl:sort select="COM_LASTNAME" />

                    <fo:block page-break-before="always"></fo:block>
                    <fo:table width="100%" font-family="calibri" font-size="10pt">
                        <xsl:call-template name="table-column-define" />
                        <fo:table-body>

                            <xsl:for-each select="key('key_cust_id', ID_CUSTOMER)">

                                <xsl:if test="position() = 1">
                                    <!-- print header of document like company name, date, invocie nr-->
                                    <xsl:call-template name="table-header" />
                                </xsl:if>
                                    <xsl:call-template name="table-data"/>
                            </xsl:for-each>


                        </fo:table-body>
                    </fo:table>
                            <!-- START: when record end print TOTAL -->
                            <xsl:variable name="customer_id" select="ID_CUSTOMER"/>
                            <fo:table width="100%" font-family="calibri" font-size="10pt">
                                <xsl:call-template name="sub-table-column-define" />
                                <fo:table-body>

                                    <fo:table-row xsl:use-attribute-sets="table-row">
                                        <fo:table-cell>
                                            <xsl:attribute name="number-columns-spanned">
                                                <xsl:value-of select="5"/>
                                            </xsl:attribute>
                                        <fo:block><xsl:value-of select="$newline"/></fo:block>
                                        </fo:table-cell>                    
                                    </fo:table-row> 

                                    <xsl:for-each
                                        select="$dataRowset2/ROWSET2_ROW[ID_CUSTOMER/text() = $customer_id]">
                                        <xsl:call-template name="sub-table-data" />
                                    </xsl:for-each>
                                </fo:table-body>
                            </fo:table>
                            <!-- END: when record end print TOTAL -->   
                </xsl:for-each>

            </fo:block-container>
        </xsl:if>

    </xsl:template>

</xsl:stylesheet>

在上面的代码中,我正在id_customer上创建键,每当新客户发现我正在创建页面的页眉,然后在表中打印属于该客户的数据,这些数据位于行集合1中,然后在最后打印行集合2中的总计


在接下来的代码中,我正在传递样式表中的参数,该参数在整个PDF上打印“草稿”,或者根本不打印,但我希望在每个页面上打印“COMPLETED=0”的特定公司的草稿不为不符合此条件的公司打印草稿。

您应该查看
。这应该可以完成任务。标记永远不会显示,无论它们是否包含内容。这是因为检索标记在指定位置搜索标记,并显示其内容。因此,如果您没有在标记中放入任何内容,则检索标记将不会显示任何内容。如果有内容,检索标记将显示内容。 标记必须处于流中。检索标记必须位于静态内容中。这样,检索标记将搜索
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    xmlns:math="http://exslt.org/math" 
    xmlns:exslt="http://exslt.org/common"
    xmlns:str="http://exslt.org/strings"
    exclude-result-prefixes="exslt math str">

    <xsl:import href="stylesheet.xsl"/>

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:variable name="debug" select="false()"/>

    <xsl:variable name="dataRowset1" select="DOCUMENT/DATA/ROWSET1/ROWSET1_ROW"/>
    <xsl:param name="printheader" select="true()"/>

    <xsl:key name="key_cust_id" match="ROWSET1_ROW" use="ID_CUSTOMER"/>

    <!-- ###### Main template ###### -->
    <xsl:template match="/">
        <xsl:call-template name="paperlayout">
            <xsl:with-param name="draft" select="//ROWSET1/ROWSET1_ROW/COMPLETED =  0"/>
            <xsl:with-param name="printheader" select="$printheader"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:variable name="newline">
        <xsl:text>
        </xsl:text>
    </xsl:variable>


    <!--############## body ##############-->
    <xsl:template name="body">
        <xsl:apply-templates select="DOCUMENT/DATA" />
    </xsl:template>

    <xsl:template match="DATA">

        <xsl:variable name="dataRowset2" select="ROWSET2" />
        <!-- Status M check -->
        <xsl:if test="ROWSET1 != ''">

            <fo:block-container xsl:use-attribute-sets="section">

                <xsl:variable name="dataRowset1" select="ROWSET1" />

                <xsl:for-each select="//ROWSET1_ROW[generate-id(.)=generate-id(key('key_cust_id', ID_CUSTOMER)[1])]">
                    <xsl:sort select="COM_LASTNAME" />

                    <fo:block page-break-before="always"></fo:block>
                    <fo:table width="100%" font-family="calibri" font-size="10pt">
                        <xsl:call-template name="table-column-define" />
                        <fo:table-body>

                            <xsl:for-each select="key('key_cust_id', ID_CUSTOMER)">

                                <xsl:if test="position() = 1">
                                    <!-- print header of document like company name, date, invocie nr-->
                                    <xsl:call-template name="table-header" />
                                </xsl:if>
                                    <xsl:call-template name="table-data"/>
                            </xsl:for-each>


                        </fo:table-body>
                    </fo:table>
                            <!-- START: when record end print TOTAL -->
                            <xsl:variable name="customer_id" select="ID_CUSTOMER"/>
                            <fo:table width="100%" font-family="calibri" font-size="10pt">
                                <xsl:call-template name="sub-table-column-define" />
                                <fo:table-body>

                                    <fo:table-row xsl:use-attribute-sets="table-row">
                                        <fo:table-cell>
                                            <xsl:attribute name="number-columns-spanned">
                                                <xsl:value-of select="5"/>
                                            </xsl:attribute>
                                        <fo:block><xsl:value-of select="$newline"/></fo:block>
                                        </fo:table-cell>                    
                                    </fo:table-row> 

                                    <xsl:for-each
                                        select="$dataRowset2/ROWSET2_ROW[ID_CUSTOMER/text() = $customer_id]">
                                        <xsl:call-template name="sub-table-data" />
                                    </xsl:for-each>
                                </fo:table-body>
                            </fo:table>
                            <!-- END: when record end print TOTAL -->   
                </xsl:for-each>

            </fo:block-container>
        </xsl:if>

    </xsl:template>

</xsl:stylesheet>