2011-09-23 4 views
0

정의되지 않은 요소 수 (indtr)를 사용하여 xsl-fo에서 테이블을 생성합니다. ?XSLT를 사용하여 동적 XSL-FO 테이블 만들기

<xsl:template match="pr-levels"> 
    <fo:table xsl:use-attribute-sets="table_p" break-after="page" force-page-count="no-force"> 
     <fo:table-column column-number="1" xsl:use-attribute-sets="table_col_p"/> 
     <fo:table-column column-number="2" xsl:use-attribute-sets="table_col_p"/> 
     <fo:table-column column-number="3" xsl:use-attribute-sets="table_col_p"/> 
     <fo:table-column column-number="4" xsl:use-attribute-sets="table_col_p"/> 
     <fo:table-column column-number="5" xsl:use-attribute-sets="table_col_p"/> 

     <fo:table-header xsl:use-attribute-sets="table_header"> 
       <xsl:for-each select="prs/pr_nme"> 
        <fo:table-cell> 
         <fo:block> 
          <xsl:apply-templates/> 
         </fo:block> 
        </fo:table-cell> 
       </xsl:for-each> 
     </fo:table-header> 

     <fo:table-body > 
      <fo:table-row> 
       <xsl:for-each select="prs/nt"> 
        <fo:table-cell> 
         <fo:block xsl:use-attribute-sets="nt" > 
          <xsl:apply-templates/> 
         </fo:block> 
        </fo:table-cell> 
       </xsl:for-each> 
      </fo:table-row> 

      <fo:table-row> 
       <xsl:for-each select="prs/b_is"> 
        <fo:table-cell padding="1pt"> 
         <fo:block> 
          <xsl:value-of select="indtr[1]"/> 
         </fo:block> 
        </fo:table-cell> 
       </xsl:for-each> 
      </fo:table-row> 
      <fo:table-row> 
       <xsl:for-each select="prs/b_is"> 
        <fo:table-cell padding="1pt"> 
         <fo:block> 
          <xsl:value-of select="indtr[2]"/> 
         </fo:block> 
        </fo:table-cell> 
       </xsl:for-each> 
      </fo:table-row> 
      <fo:table-row> 
       <xsl:for-each select="prs/b_is"> 
        <fo:table-cell padding="1pt"> 
         <fo:block> 
          <xsl:value-of select="indtr[3]"/> 
         </fo:block> 
        </fo:table-cell> 
       </xsl:for-each> 
      </fo:table-row> 
      <fo:table-row> 
       <xsl:for-each select="prs/b_is"> 
        <fo:table-cell padding="1pt"> 
         <fo:block> 
          <xsl:value-of select="indtr[4]"/> 
         </fo:block> 
        </fo:table-cell> 
       </xsl:for-each> 
      </fo:table-row> 
      <fo:table-row> 
       <xsl:for-each select="prs/b_is"> 
        <fo:table-cell padding="1pt"> 
         <fo:block> 
          <xsl:value-of select="indtr[5]"/> 
         </fo:block> 
        </fo:table-cell> 
       </xsl:for-each> 
      </fo:table-row> 
     </fo:table-body> 
     </fo:table> 
    </xsl:template> 
:

현명한 방법이가 할 궁금 여기

내 입력 XML 파일 여기

<pr-levels> 
    <prs> 
     <pr_nme><![CDATA[Level 1]]></pr_nme> 
     <nt><![CDATA[standards:]]></nt> 
     <b_is> 
      <indtr id="5684"><![CDATA[cell_1]]></indtr> 
      <indtr id="5684"><![CDATA[cell_2]]></indtr> 
      <indtr id="5684"><![CDATA[cell_3]]></indtr> 
      <indtr id="5684"><![CDATA[cell_4]]></indtr> 
     </b_is> 
    </prs> 
    <prs> 
     <pr_nme><![CDATA[Level 2]]></pr_nme> 
     <nt><![CDATA[standards:]]></nt> 
     <b_is> 
      <indtr id="5684"><![CDATA[cell_1]]></indtr> 
     </b_is> 
    </prs> 
    <prs> 
     <pr_nme><![CDATA[Level 3]]></pr_nme> 
     <nt><![CDATA[standards:]]></nt> 
     <b_is> 
      <indtr id="5684"><![CDATA[cell_1]]></indtr> 
      <indtr id="5684"><![CDATA[cell_2]]></indtr> 
     </b_is> 
    </prs> 
    <prs> 
     <pr_nme><![CDATA[Level 4]]></pr_nme> 
     <nt><![CDATA[standards:]]></nt> 
     <b_is> 
      <indtr id="5684"><![CDATA[cell_1]]></indtr> 
      <indtr id="5684"><![CDATA[cell_2]></indtr> 
      <indtr id="5684"><![CDATA[cell_3]]></indtr> 
      <indtr id="5684"><![CDATA[cell_4]></indtr> 
      <indtr id="5684"><![CDATA[cell_5]]></indtr> 
      <indtr id="5684"><![CDATA[cell_6]]></indtr> 
      <indtr id="5684"><![CDATA[cell_7]]></indtr> 
     </b_is> 
    </prs> 
    <prs> 
     <pr_nme><![CDATA[Level 5]]></pr_nme> 
     <nt><![CDATA[standards:]]></nt> 
     <b_is> 
      <indtr id="5684"><![CDATA[cell_1]]></indtr> 
      <indtr id="5684"><![CDATA[cell_2]]></indtr> 
      <indtr id="5684"><![CDATA[cell_3]]></indtr> 
      <indtr id="5684"><![CDATA[cell_4]]></indtr> 
      <indtr id="5684"><![CDATA[cell_5]]></indtr> 
      <indtr id="5684"><![CDATA[cell_6]]></indtr> 
      <indtr id="5684"><![CDATA[cell_7]]></indtr> 
      <indtr id="5684"><![CDATA[cell_8]]></indtr> 
      <indtr id="5684"><![CDATA[cell_9]]></indtr> 
      <indtr id="5684"><![CDATA[cell_10]]></indtr> 
      <indtr id="5684"><![CDATA[cell_11]]></indtr> 
      <indtr id="5684"><![CDATA[cell_12]]></indtr> 
      <indtr id="5684"><![CDATA[cell_13]]></indtr> 
      <indtr id="5684"><![CDATA[cell_14]]></indtr> 
      <indtr id="5684"><![CDATA[cell_15]]></indtr> 
      <indtr id="5684"><![CDATA[cell_16]]></indtr> 
      <indtr id="5684"><![CDATA[cell_17]]></indtr> 
      <indtr id="5684"><![CDATA[cell_18]]></indtr> 
      <indtr id="5684"><![CDATA[cell_19]]></indtr> 
     </b_is> 
    </prs> 
</pr-levels> 

이다는 XSL-FO 테이블을 만들어 내 XSLT 템플릿입니다

<b_is>에 NULL, 1,69 또는 그 밖의 숫자가 <indtr> 일 수 있지만 지금은 숫자를 하드 코딩합니다. 내 질문은 동적으로 계산할 수있는 방법입니다. ?이 흥미로운 문제이다해서 indtrs의 수와는 ... XSL에서 루프 내 table.maybe A의

________________________________________________________ 
| level 1 | level 2 | level 3 | level 4 | level 5 | 
-------------------------------------------------------- 
|standards:|standards:|standards:|standards:|standards:| 
-------------------------------------------------------- 
| cell 1 | cell 1 | cell 1 | cell 1 | cell 1 | 
-------------------------------------------------------- 
| cell 2 | cell 2 | cell 2 | cell 2 | cell 2 | 
-------------------------------------------------------- 
|   | cell 3 | cell 3 | cell 3 | cell 3 | 
-------------------------------------------------------- 
|   | cell 4 |   |   | cell 4 | 
-------------------------------------------------------- 
|   |   |   |   | cell 5 | 
-------------------------------------------------------- 
|   |   |   |   | cell 6 | 
-------------------------------------------------------- 
+0

표 모양이 어떻게됩니까? 각 ''이 새 테이블이고 ''및 ''에 대해 하나의 셀이있는 새로운 행이 있음을 알 수 있습니다. ''과'' 어린이들과 함께하려는 것은 무엇입니까? ''이 새로운 행으로, 각' '이 셀이되어야합니까? 또는 각 셀에 ''이 새 행으로 있어야하나요? –

+0

안녕하세요 @DevNull 답장을 보내 주셔서 감사합니다. 같은 b_is에있는 모든 indtr이 같은 열에있을 것입니다. 시각화 할 수 있도록 예제를 추가했습니다. – Jimmy

+0

나는 앞으로 며칠 안에 무엇인가를 정리하려고 노력할 것이다. –

답변

0

를 행을 추가

함께 여러 하드 코딩 fo:table-row 교체 :

<xsl:variable name="pr-levels" select="." /> 
<xsl:for-each 
    select="1 to max(for $prs in prs 
         return count($prs/b_is/indtr))"> 
    <xsl:variable name="row" select="." as="xs:integer" /> 
    <fo:table-row> 
    <xsl:for-each select="$pr-levels/prs"> 
     <fo:table-cell padding="1pt"> 
     <fo:block> 
      <xsl:value-of select="b_is/indtr[$row]"/> 
     </fo:block> 
     </fo:table-cell> 
    </xsl:for-each> 
    </fo:table-row> 
</xsl:for-each>