2017-11-15 25 views
0

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を印刷しないこと。

+0

これは、Javaで行うには、特に何もしていて、XSLTを関与させるだけで、偶然と思われます。この質問は主にXSL-FOに関するものです。タグが編集されました。 –

答えて

2

<fo:marker><fo:retrieve-marker>をご覧ください。それは仕事をするはずです。マーカーが内容を持っているかどうかにかかわらず、マーカーは決して表示されません。これは、検索マーカーが指定された位置のマーカーを検索し、その内容を表示するためです。だからあなたがあなたのマーカーに何も入れていなければ、検索マーカーは何も表示しません。コンテンツがある場合、検索マーカーにコンテンツが表示されます。 マーカーはフロー内にある必要があります。リトリーブ・マーカーは静的な内容でなければなりません。こうすることで、検索マーカーはマーカーの最後のコンテンツを検索し、異なる静的コンテンツを持つことができます。 少し助けてくれることを願っています。

相続人はいくつかのドキュメントへのリンク:markers example