xslt 1.0を使用してPDFドキュメントを作成しています。これは、データに基づいてページに静的コンテンツ(DAFT)を適用する必要があります。たとえば、COMPLETED = DRAFT " ページにあります。動的スタイルシートまたはXSLT 1.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>
スタイルシート(stylesheet.xsl):
<xsl:template name="paperlayout">
<xsl:param name="draft" select="false()"/>
<xsl:param name="printheader"/>
<fo:root>
<fo:layout-master-set>
<fo:page-sequence-master master-name="paperlayout">
<fo:single-page-master-reference master-reference="title" page-position="first"/>
<fo:single-page-master-reference master-reference="rest" page-position="rest"/>
</fo:page-sequence-master>
<!-- title page-->
<fo:simple-page-master master-name="title" page-height="297mm" page-width="210mm" margin-top="20mm"
margin-bottom="0mm" margin-left="20mm" margin-right="15mm">
<fo:region-body region-name="body" margin-bottom="30mm" margin-top="25mm"/>
<fo:region-before region-name="header-first" extent="0mm"/>
<fo:region-after region-name="footer" extent="20.5mm"/>
</fo:simple-page-master>
<!-- rest page-->
<fo:simple-page-master master-name="rest" page-height="297mm" page-width="210mm" margin-top="20mm"
margin-bottom="0mm" margin-left="20mm" margin-right="15mm">
<fo:region-body region-name="body" margin-bottom="30mm" margin-top="25mm"/>
<fo:region-before region-name="header-rest" extent="0mm"/>
<fo:region-after region-name="footer" extent="20.5mm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="paperlayout">
<!--############## header ##############-->
<fo:static-content flow-name="header-first">
<xsl:if test="$draft">
<fo:block-container position="absolute" left="0mm" top="05mm">
<fo:block>
<fo:instream-foreign-object>
<svg width="680" height="920" xmlns="http://www.w3.org/2000/svg">
<text font-family="eurostyle" font-size="10pt" font-weight="900" style="fill:rgb(255,192,192)" x="260" y="20" width="680" text-anchor="middle" transform="rotate(-54, 340, 15)">
DRAFT
</text>
</svg>
</fo:instream-foreign-object>
</fo:block>
</fo:block-container>
</xsl:if>
<xsl:choose>
<xsl:when test="$printheader">
<xsl:call-template name="logo"/>
</xsl:when>
<xsl:otherwise>
<fo:block-container>
<fo:block><fo:leader /></fo:block>
</fo:block-container>
</xsl:otherwise>
</xsl:choose>
</fo:static-content>
<fo:static-content flow-name="header-rest">
<xsl:if test="$draft">
<fo:block-container position="absolute" left="0mm" top="05mm">
<fo:block>
<fo:instream-foreign-object>
<svg width="680" height="920" xmlns="http://www.w3.org/2000/svg">
<text font-family="eurostyle" font-size="10pt" font-weight="900" style="fill:rgb(255,192,192)" x="260" y="20" width="680" text-anchor="middle" transform="rotate(-54, 340, 15)">
Entwurf
</text>
</svg>
</fo:instream-foreign-object>
</fo:block>
</fo:block-container>
</xsl:if>
<xsl:choose>
<xsl:when test="$printheader">
<xsl:call-template name="logo"/>
</xsl:when>
<xsl:otherwise>
<fo:block-container>
<fo:block><fo:leader /></fo:block>
</fo:block-container>
</xsl:otherwise>
</xsl:choose>
</fo:static-content>
<!--############## footer ##############-->
<xsl:if test="$printheader">
<xsl:call-template name="footerData"/>
</xsl:if>
<!--############## body ##############-->
<fo:flow flow-name="body" xsl:use-attribute-sets="body">
<xsl:call-template name="body"/>
<fo:block id="endofdoc"></fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
XSLT CODEは、PDFを作成するために使用される:
<?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で、新しい顧客が見つかったときはいつでも、私はページのヘッダを作成しています。 ROWSET1その後、私はROWSET2に入っている合計を印刷しています。
このコードを聞くと、PDF全体または「印刷しない」で「DRAFT」を印刷するスタイルシートにパラメータを渡していますが、「完了」= 0の特定の会社のすべてのページで下書きを印刷したいこの条件を満たしていない企業に対してDRAFTを印刷しないこと。
これは、Javaで行うには、特に何もしていて、XSLTを関与させるだけで、偶然と思われます。この質問は主にXSL-FOに関するものです。タグが編集されました。 –