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