2017-12-28 48 views
1

私は、以下の単純化されたXML構造のXSL-FO 3.0変換に基づいてPDFを生成する大規模コーパスを持っている:XSL-FOの改ページ、未亡人や孤児

<corpus> 
    <deposition> 
    <text> 
     <deposition-title>foo title</deposition-title> 
     <seg>foo paragraph 1</seg> 
     <seg>foo paragraph 2</seg> 
     <seg>foo paragraph 3</seg> 
     <appnotes> 
     <appitem>foo apparatus item 1</appitem> 
     </appnotes> 
     <footnotes> 
     <footitem>foo note 1</footitem> 
     <footitem>foo note 1</footitem> 
     </footnotes> 
    </text> 
    </deposition> 
    <deposition> 
    <text> 
     <deposition-title>foo title</deposition-title> 
     <seg>foo paragraph 1</seg> 
     <seg>foo paragraph 2</seg> 
     <appnotes/> 
     <footnotes> 
     <footitem>foo note 1</footitem> 
     </footnotes> 
    </text> 
    </deposition> 
    [...] 
</corpus> 

私はXSL-FO 3.0を使用するようになります。以下の(上付き文字や斜体のためのマイナスいくつかのインラインマークアップは):一般的に次のようになりますように

<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xd="http://www.pnp-software.com/XSLTdoc" 
version="3.0"> 

<xsl:template match="/"> 
    <fo:root> 
     <fo:layout-master-set> 
      <fo:simple-page-master 
       master-name="page-recto" 
       page-height="29.7cm" page-width="21cm" 
       margin-top="2cm" margin-bottom="2cm" 
       margin-left="3cm" margin-right="1.5cm"> 
       <fo:region-body 
        region-name="xsl-region-body"/> 
      </fo:simple-page-master> 
     </fo:layout-master-set> 

     <fo:page-sequence master-reference="page-recto"> 
      <fo:flow flow-name="xsl-region-body" 
       font-family="Times" font-weight="normal" 
       font-size="8pt" space-before="8pt" space-after="8pt" 
       text-align="justify" end-indent="120pt"> 
       <xsl:apply-templates/> 
      </fo:flow> 
     </fo:page-sequence> 

    </fo:root> 
</xsl:template> 

<xsl:template match="text"> 
    <fo:block widows="10" orphans="10" 
     font-size="9pt" font-weight="bold" 
     padding-bottom="1cm" end-indent="120pt"> 
     <xsl:apply-templates/> 
    </fo:block> 
</xsl:template> 


<xsl:template match="seg"> 
    <fo:block 
     font-family="Times" font-weight="normal" line-height="12pt" line-stacking-strategy="font-height" 
     font-size="10pt" space-before="10pt" space-after="10pt" text-align="justify" end-indent="120pt"> 
     <xsl:apply-templates/> 
    </fo:block> 
</xsl:template> 

<xsl:template match="appnotes"> 
    <xsl:choose> 
     <xsl:when test="./appitem"> 
      <fo:leader leader-pattern="rule" leader-length="2cm" rule-style="solid" rule-thickness=".2pt"/>  
      <fo:block font-size="8pt" font-weight="normal" end-indent="120pt"> 
       <xsl:for-each select="./appitem"> 
        <fo:inline keep-together="always"><xsl:apply-templates/>&#160;&#160;&#160;</fo:inline> 
       </xsl:for-each> 
      </fo:block></xsl:when> 
     <xsl:otherwise></xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="footnotes"> 
    <xsl:choose> 
     <xsl:when test="./footitem"> 
      <fo:leader leader-pattern="rule" leader-length="2cm" rule-style="solid" rule-thickness=".2pt"/> 
       <xsl:for-each select="./footitem"> 
        <fo:block font-size="8pt" font-weight="normal" end-indent="120pt"> 
         <xsl:apply-templates/> 
        </fo:block> 
       </xsl:for-each> 
      <fo:leader leader-pattern="rule" leader-length="2cm" rule-style="solid" rule-thickness=".2pt"/>  
     </xsl:when> 
     <xsl:otherwise> 
      <fo:leader leader-pattern="rule" leader-length="2cm" rule-style="solid" rule-thickness=".2pt"/>  
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 

それは繰り返しセクションを生成します。

Nice output, no bad page breaks

しかし、XSL-FOは、いくつかの改ページ、私は一緒に保つの組み合わせを使用して解くことができないような問題、未亡人、孤児など<seg>

Title split from content

から

<deposition-title>休憩を生成

<seg><appnotes>から休憩と<footnotes>

Content split from appnotes/footnotes

目標:最終<seg>

への最初の <seg>

  • <appnotes><footnotes>スティックに

    1. <deposition-title>スティック:私はどんな<text>を壊すページについて、次の2つのルールを適用したいのですが

    事前の感想をお寄せいただきありがとうございます。あなたは

    <xsl:template match="deposition-title"> 
        <fo:block keep-with-next="always"> 
         <xsl:apply-templates/> 
        </fo:block> 
    </xsl:template> 
    

    を追加する場合

  • 答えて

    3

    は、その後タイトルはあなたが作る最初のワンセグブロックと同じページに配置する必要があります。私はあなたがそうおそらくtext<xsl:apply-templates select="node() except footnotes/>に変更し、その後にされなければならないテンプレートマッチングで<xsl:apply-templates/>を変える最後のsegブロックと一緒にそれらの両方を維持したい理解としてkeep-with-previous

    同様の構成は、APPノートおよび脚注のために行う必要がありますテンプレートマッチングappnotesラッパーを作成して脚注を処理する

    <xsl:template match="appnotes"> 
        <fo:block keep-with-previous="always"> 
        ... 
        <xsl:apply-templates select="following-sibling::footnotes"/> 
        </fo:block> 
    </xsl:template> 
    
    +0

    驚くほど簡単です。どうもありがとう! – idjet

    +0

    私は結果をよりよく調べるので、このソリューションは最初のsegブロックでタイトルを保持するように働いたことに気付きました。しかし、それはappnotesと脚注のためにそうしていない:私は既存のテンプレート内のすべてをとって、 ''で囲んだ。例えば、最初の ''は残りのappnotesから分割されます。ありがとう。 – idjet

    +0

    あなたはappnotesと脚注のために1つの 'fo:block'ラッパーを持っていますか?また、質問に情報を追加したり、どのFOプロセッサを使用しているかを示すタグとして、XSL-FOプロパティが実際にどのように機能しているかについての知識がある程度認められていますが、 FOプロセッサーについて言及すると、より具体的な提案を与えることができるさまざまな製品の経験豊富なユーザーがいることを示唆しています。 –

    1

    私は受け入れられた回答に続き、コメントに記載されている1つの問題について改訂コードをここに掲載しています。今すぐ<appnotes><footnotes>は1つのテンプレートで、1つは<fo:block>です。これはRenderXで処理されます。

    <xsl:template match="footnotes | appnotes"> 
        <fo:block font-size="8pt" font-weight="normal" end-indent="120pt" keep-with-previous="always"> 
         <xsl:choose> 
          <xsl:when test="./appitem"> 
           <fo:leader leader-pattern="rule" leader-length="2cm" rule-style="solid" rule-thickness=".2pt" keep-with-previous="always"/>  
           <fo:block keep-with-previous="always"> 
            <xsl:for-each select="./appitem"> 
             <fo:inline><xsl:apply-templates/>&#160;&#160;&#160;</fo:inline> 
            </xsl:for-each> 
           </fo:block> 
          </xsl:when> 
         </xsl:choose> 
         <xsl:choose> 
          <xsl:when test="./footitem"> 
           <fo:leader leader-pattern="rule" leader-length="2cm" rule-style="solid" rule-thickness=".2pt" keep-with-previous="always"/> 
           <xsl:for-each select="./footitem"> 
            <fo:block keep-with-previous="always"> 
             <xsl:apply-templates/> 
            </fo:block> 
           </xsl:for-each>  
           <fo:leader leader-pattern="rule" leader-length="2cm" rule-style="solid" rule-thickness=".2pt" keep-with-previous="always"/> 
          </xsl:when> 
         </xsl:choose> 
        </fo:block> 
    </xsl:template> 
    
    関連する問題