2017-12-28 34 views
1

나는 다음과 같은 간단한 XML 구조의 XSL-FO 3.0 변환을 기반으로 PDF를 생산하는 대규모 말뭉치를 다음 (윗 첨자와 이탤릭체에 대한 마이너스 일부 인라인 마크 업) : 일반적으로 다음과 같이 같은XSL-FO의 페이지 나누기, 과부와 고아

<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

,451,515,

목표 : 최종 <seg>

에 처음 <seg>

  • <appnotes><footnotes> 지팡이

    1. <deposition-title> 스틱 : 어떤 <text>을 깨는 페이지에 대해 다음과 같은 두 가지 규칙을 적용 할

    사전 통찰력에 감사드립니다.

  • 답변

    3

    그런 다음 제목이 생산하는 첫 번째 SEG 블록으로 같은 페이지에 넣을 수 있어야

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

    를 추가하는 경우.

    나는 당신이 다음 <xsl:apply-templates select="node() except footnotes/>과로 변경해야 마지막 seg 블록 그래서 아마 text 일치하는 템플릿의 <xsl:apply-templates/> 변화와 함께 모두를 유지하려는 이해 keep-with-previous와 유사한 건설의 애플리케이션 노트 및 각주를 위해해야 템플릿 일치 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

    결과를 자세히 살펴보면이 솔루션이 첫 번째 세그먼트로 제목을 유지하는 데 효과적 이었음을 알 수 있습니다.그러나 appnotes와 각주에 대해서는 그렇게하지 않습니다 : 나는 기존 템플릿 내 모든 것을 가져 와서''로 감 쌉니다. 예를 들어 첫 번째 ''은 나머지 앱 노트와 분리됩니다. 감사. – idjet

    +0

    앱 노트와 각주에 대한 하나의'fo : block' 래퍼가 있습니까? 또한 질문에 정보를 추가하고 어떤 FO 프로세서를 사용하는지에 대한 태그를 추가하는 데 도움이 될 수 있습니다. 이러한 구현에서 실제로 이러한 XSL-FO 속성이 얼마나 잘 작동하는지에 대한 지식을 인정해야합니다. 여기에 FO 프로세서에 대해 언급 할 때보다 구체적인 제안을 줄 수있는 다양한 제품의 숙련 된 사용자가 있음을 알 수 있습니다. –

    1

    허용되는 답변에 대한 답변에서 의견에 명시된 한 가지 문제에 대한 수정 된 코드를 게시합니다. 이제 <appnotes><footnotes>은 하나의 템플릿이며 하나는 <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>