2011-02-11 5 views
0

저는 xsl을 처음 사용하기 때문에 이것은 분명한 대답 일 수 있습니다.XSL 테이블의 행을 별도의 페이지 시퀀스로 분리 할 수 ​​있습니까?

xml에서 테이블을 만들고 FOP를 사용하여 java에서 xsl 스타일 시트를 만듭니다. 테이블에는 수천 개의 행 (> 50,000)이있을 수 있으므로 Java 힙 공간을 사용하지 않도록 FOP의 메모리 사용 공간을 줄이려고합니다.

지금 내 xsl은 전체 <fo:table-body> 요소를 단일 페이지 시퀀스로 그룹화하므로 테이블의 행을 생성하는 동안 메모리가 재활용되지 않습니다. 어떻게 든 개인 또는 행 그룹을 별도의 페이지 시퀀스로 나눌 수 있습니까? 요소는 <fo:table> 요소의 법적 내부에>,하지만 난 <fo:page-sequence 생각하지 않는다 :

가 나는 인덱스로 요소를 반복 할 수 있습니다 알고 (Xslt - iterate nodes in chunks이 유래 응답 참조).

테이블 내에서 행을 분해 할 수없는 경우 행을 개별 테이블로 분리 할 수있는 방법이 있습니까?

편집 : 나는 제안에서이 함께 왔어요

입력 XML :

<?xml version="1.0" encoding="UTF-8"?> 
<table title="sample"> 
<headers> 
    <column>title1</column> 
    <column>title2</column> 
    <column>title3</column> 
    <column>title4</column> 
    <column>title5</column> 
    <column>title6</column> 
</headers> 
<row> 
    <column>0</column> 
    <column>ABC</column> 
    <column>0</column> 
    <column>Claim Appeal</column> 
    <column>asldkjf98aet24</column> 
    <column>897123947623</column> 
</row> 
<row> 
    ... 
</row> 
    ... 
</table> 

입력 XSL :이

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo"> 
<xsl:output method="xml" version="1.0" omit-xml-declaration="no" 
indent="yes"/> 
<xsl:template match="table"> 
<xsl:variable name="startRow" select="0"/> 
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
<fo:layout-master-set> 
<fo:simple-page-master master-name="simpleA4" page-height="29.7cm" 
page-width="22cm" margin-top="2cm" margin-bottom="2cm" 
margin-left="1.5cm" margin-right="1.5cm"> 
<fo:region-body/> 
</fo:simple-page-master> 
</fo:layout-master-set> 
<xsl:param name="startRow"/> 
<fo:page-sequence> 
<fo:table> 
     <xsl:if test="$startRow = 0"> 
    <fo:table-header> 
     <fo:table-row font-weight="bold"> 
       <xsl:apply-templates select="headers"/> 
     </fo:table-row> 
    </fo:table-header> 
     </xsl:if> 
     <xsl:foreach select="row[position() &gt; $startRow &amp;&amp; 
position() &lt; 54]"> 
      <!-- call row rendering template --> 
      <fo:table-body> 
      <xsl:apply-templates select="row"/> 
      </fo:table-body> 
     </xsl:foreach>  
    </fo:table> 
    </fo:page-sequence> 
    </fo:root>  
    <xsl:if test="$startRow &lt; 100000"> 
     <xsl:apply-templates select="."> 
      <xsl:with-param name="startRow" select="$startRow + 54"/> 
     </xsl:apply-templates> 
    </xsl:if> 
    <xsl:template match="headers"> 
     <xsl:for-each select="column"> 
      <fo:table-cell> 
       <fo:block> 
        <xsl:value-of select="."/> 
       </fo:block> 
      </fo:table-cell> 
     </xsl:for-each> 
    </xsl:template>  
    <xsl:template match="row"> 
    <fo:table-row> 
     <xsl:for-each select="column"> 
     <fo:table-cell> 
      <fo:block> 
       <xsl:value-of select="."/> 
      </fo:block> 
     </fo:table-cell> 
    </xsl:for-each> 
    </fo:table-row> 
    </xsl:template> 
</xsl:template> 
</xsl:stylesheet> 

, 내가 <page-sequence에 오류가 > 태그에 대한 마스터 참조,하지만 난 마스터 참조 = "simpleA4"아무 소용이 시도했다. 뭐라 구요?

구문 오류 외에 다른 문제는 무엇입니까?

답변

0

그들은 확실히 합법적이지 않습니다.

그러나 테이블을 닫고 페이지 시퀀스를 닫은 다음 새 페이지 시퀀스와 동일한 매개 변수 (헤더 빼기)가있는 새 테이블을 시작할 수 있습니다.

<xsl:template match="myTableElement"> 
    <xsl:param name="startRow"/> 
    <fo:page-sequence> <!-- you may only want to put this in if this isn't the first chunk --> 
    <fo:table> 
     <xsl:if test="$startRow = 0"> 
      <!-- render header --> 
     </xsl:if> 
     <xsl:foreach select="elements between between startRow and startRow+50000"> 
      <!-- call row rendering template --> 
     </xsl:foreach> 

    </fo:table> 
    </fo:page-sequence>  

    <xsl:if test="there are unrendered elements left"> 
     <xsl:apply-templates select="."> 
      <xsl:with-param name="startRow" select="$startRow + 50000"/> 
     </xsl:apply-templates> 
    </xsl:if> 
</xsl:template> 

이것은 당신이 이상적인 솔루션을 얻을 수있는 내가 가까이를 두려워한다 :

는 여기에 몇 가지 의사 XSLT 코드입니다.

+0

이것이 어떻게 달성 될 수 있는지에 대한 작은 예를 제공 할 수 있습니까? 나는 그들 안에있는 테이블과 함께 루프를 설정하는 물류에 대한 핸들을 얻을 수없는 것 같습니다. 편집 : 고마워요, 이제 xslt의 구문을 이해하여 선택 의사 코드를 작동 순서로 가져와야합니다. – pclem12

+0

@ pclem12 불행하게도 믿을만한 도구가 빠졌지 만 내가 할 수있는 것을 보게 될 것이다. – biziclop

+0

고마워, 나는 xsl을 가진 완전한 초심자이다, 그래서 내가 통풍 관에 느린 경우에 저를 용서하십시오 – pclem12

관련 문제