2013-08-21 5 views
0

xsl fo를 사용하여 동적 열 수의 테이블을 만드는 방법은 무엇입니까? 열의 수는 입력 파일마다 다르지만 단일 입력 파일에 대해 고정됩니다. 여기 xsl fo의 동적 열 수식 처리

내가 number-columns-repeated 속성에서 온 같은

Obj1 
------------------------------------------ 
prop1  | prop2   | prop3 
------------------------------------------- 
old | new | old | new  | old | new 
------------------------------------------- 
5 | 7 | 2 | 1  | 3 | 6 
이하 나는 ...있는 테이블을 원하는 샘플 XML

<root> 
<ColNo>3</ColNo> 
<Objects> 
<object id="1"> 
<prop1 old="5" new="7"> 
<prop2 old="2" new="1"> 
<prop3 old="3" new="6"> 
</object> 
</Objects> 
</root> 

이다 그러나 그것을 사용하는 방법을 이해 할 수없는 ..

더 나은 접근 방법이 있으면 알려줘.

감사합니다.

답변

1

당신은 시도한 양을 나타내지는 않지만, 입력 데이터가 잘 형성되지 않았으므로별로 의심하지 않습니다. 또한 여러 행의 데이터가 표시되는 방식을 나타내지 않으므로 추가 정보를 추가하는 데이터를 수정하여 아래에 추측했습니다.

완전한 해결책이 뒤 따른다. 그것은 두 가지 행 충전 기술을 사용하며, 교실에서 사용하는 일러스트레이션 (운동은 물론)과 유사합니다.

준수하는 XSL-FO 프로세서를 통해 아래 출력을 실행하면 사용자가 요청한대로 표가 요약됩니다.

t:\ftemp>type table.xml 
<root> 
<ColNo>3</ColNo> 
<Objects> 
<object id="1"> 
<prop1 old="5" new="7"/> 
<prop2 old="2" new="1"/> 
<prop3 old="3" new="6"/> 
<prop1 old="15" new="17"/> 
<prop2 old="12" new="11"/> 
<prop3 old="13" new="16"/> 
</object> 
</Objects> 
</root> 

t:\ftemp>call xslt table.xml table.xsl table.fo 

t:\ftemp>type table.fo 
<?xml version="1.0" encoding="utf-8"?> 
<root xmlns="http://www.w3.org/1999/XSL/Format" font-family="Times" font-size="20pt"> 
    <layout-master-set> 
     <simple-page-master master-name="frame" page-height="210mm" page-width="297mm" margin-top="1cm" margin-bottom="1cm" margin-left="1cm" margin-right="1cm"> 
     <region-body region-name="frame-body"/> 
     </simple-page-master> 
    </layout-master-set> 
    <page-sequence master-reference="frame"> 
     <flow flow-name="frame-body"> 
     <block>Obj1</block> 
     <table border="solid 1pt" text-align="center"> 
      <table-header> 
       <table-row> 
        <table-cell number-columns-spanned="2" border="solid 1pt"> 
        <block>prop1</block> 
        </table-cell> 
        <table-cell number-columns-spanned="2" border="solid 1pt"> 
        <block>prop2</block> 
        </table-cell> 
        <table-cell number-columns-spanned="2" border="solid 1pt"> 
        <block>prop3</block> 
        </table-cell> 
       </table-row> 
       <table-row> 
        <table-cell border="solid 1pt"> 
        <block>old</block> 
        </table-cell> 
        <table-cell border="solid 1pt"> 
        <block>new</block> 
        </table-cell> 
        <table-cell border="solid 1pt"> 
        <block>old</block> 
        </table-cell> 
        <table-cell border="solid 1pt"> 
        <block>new</block> 
        </table-cell> 
        <table-cell border="solid 1pt"> 
        <block>old</block> 
        </table-cell> 
        <table-cell border="solid 1pt"> 
        <block>new</block> 
        </table-cell> 
       </table-row> 
      </table-header> 
      <table-body> 
       <table-cell border="solid 1pt"> 
        <block>5</block> 
       </table-cell> 
       <table-cell border="solid 1pt"> 
        <block>7</block> 
       </table-cell> 
       <table-cell border="solid 1pt"> 
        <block>2</block> 
       </table-cell> 
       <table-cell border="solid 1pt"> 
        <block>1</block> 
       </table-cell> 
       <table-cell border="solid 1pt"> 
        <block>3</block> 
       </table-cell> 
       <table-cell border="solid 1pt" ends-row="true"> 
        <block>6</block> 
       </table-cell> 
       <table-cell border="solid 1pt"> 
        <block>15</block> 
       </table-cell> 
       <table-cell border="solid 1pt"> 
        <block>17</block> 
       </table-cell> 
       <table-cell border="solid 1pt"> 
        <block>12</block> 
       </table-cell> 
       <table-cell border="solid 1pt"> 
        <block>11</block> 
       </table-cell> 
       <table-cell border="solid 1pt"> 
        <block>13</block> 
       </table-cell> 
       <table-cell border="solid 1pt" ends-row="true"> 
        <block>16</block> 
       </table-cell> 
      </table-body> 
     </table> 
     </flow> 
    </page-sequence> 
</root> 
t:\ftemp>type table.xsl 
<?xml version="1.0" encoding="US-ASCII"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns="http://www.w3.org/1999/XSL/Format" 
       version="1.0"> 

<xsl:output indent="yes"/> 

<xsl:template match="/"> 
<root font-family="Times" font-size="20pt"> 

    <layout-master-set> 
    <simple-page-master master-name="frame" 
         page-height="210mm" page-width="297mm" 
         margin-top="1cm" margin-bottom="1cm" 
         margin-left="1cm" margin-right="1cm"> 
     <region-body region-name="frame-body"/> 
    </simple-page-master> 
    </layout-master-set> 

    <page-sequence master-reference="frame"> 
    <flow flow-name="frame-body"> 
     <!--reposition to the top of table data--> 
     <xsl:for-each select="root/Objects/object"> 
     <block>Obj<xsl:value-of select="@id"/></block> 
     <table border="solid 1pt" text-align="center"> 
      <table-header> 
      <!--header rows - use row-based row-grouping strategy--> 
      <table-row> 
       <xsl:for-each select="*[position() &lt;= /root/ColNo]"> 
       <table-cell number-columns-spanned="2" border="solid 1pt"> 
        <block><xsl:value-of select="name(.)"/></block> 
       </table-cell> 
       </xsl:for-each> 
      </table-row> 
      <table-row> 
       <xsl:for-each select="*[position() &lt;= /root/ColNo]"> 
       <table-cell border="solid 1pt"><block>old</block></table-cell> 
       <table-cell border="solid 1pt"><block>new</block></table-cell> 
       </xsl:for-each> 
      </table-row> 
      </table-header> 
      <table-body> 
      <!--body rows - use cell-based row-grouping strategy--> 
      <xsl:apply-templates select="*"/> 
      </table-body> 
     </table> 
     </xsl:for-each> 
    </flow> 
    </page-sequence> 
</root> 
</xsl:template> 

<xsl:template match="object/*"> 
    <table-cell border="solid 1pt"> 
    <block><xsl:value-of select="@old"/></block> 
    </table-cell> 
    <table-cell border="solid 1pt"> 
    <xsl:if test="position() mod /root/ColNo = 0"> 
     <!--every time the last item of a row is encountered, signal end--> 
     <xsl:attribute name="ends-row">true</xsl:attribute> 
    </xsl:if> 
    <block><xsl:value-of select="@new"/></block> 
    </table-cell> 
</xsl:template> 

</xsl:stylesheet> 


t:\ftemp>start table.fo 

t:\ftemp>rem Done! 
+0

답변 해 주셔서 감사합니다. 문제가 명확하지 않아서 미안해. 나는 이것에 아주 새롭다, 나는 나의 추악한 문제를 아주 곤란한 방법으로 해결했다. 나는 이것을 이해하고 실행하려고 노력할 것이다. 학습 목적에 대한 간단한 질문입니다.이 내용은 무엇입니까? 'name (.) '함수 란 무엇입니까? –

+0

XPath 주소'* [position() < =/root/ColNo]는 모든 자식 요소를 먼저 처리 한 다음 선택한 자식 요소 집합의 위치가 열 번호보다 작거나 같은 경우에만 유지합니다. 그래서, 데이터 예제에서 1, 2, 3의 위치에 있습니다.'name()'함수는 주소 지정된 노드의 이름 (또는 주소 인수가없는 경우 현재 노드)을 표시하는 박람회 함수입니다. 출력 데이터는 예를 들어'prop1'을 가지고 있고 유일한 곳은'prop1'이 엘리먼트의 이름이라는 것을 보았습니다. –