2009-03-03 4 views
0

나는 XSL로 PDF를 생성하는 재미있는 작업을 해왔다. 내가 함께 일하고 있어요 XML 구조는XSL for-each의 업데이트 속성

<records> 
    <topLevel> 
     <topLevelID></topLevelID> 
     <secondLevel> 
      <secondLevelID></secondLevelID> 
      <thirdLevel> 
      </thirdLevel> 
      <thirdLevel> 
      </thirdLevel> 
     </secondLevel> 
    </topLevel> 
    <topLevel> 
     <topLevelID></topLevelID> 
     <secondLevel> 
      <secondLevelID></secondLevelID> 
      <thirdLevel> 
      </thirdLevel> 
      <thirdLevel> 
      </thirdLevel> 
     </secondLevel> 
    </topLevel> 
</records> 

나는 XML의보다 의미있는 예제를 제공하기 위해 노력할 것이다 유사하지만, 나는 존재할 수있는 법적 경계를 접근 기분이 안. XML 구조를 사용하면 모든 thirdLevel 노드에 대해 PDF에 텍스트 블록을 출력해야합니다. 내가 지금까지 가지고있는 XSL은 기본적으로, 각 thirdLevel 노드의 텍스트가 한 줄에 표시하기 위해 상단의 속성에 어떤 값을 추가 할 필요가

<xsl:for-each select ="topLevel">   
    <xsl:variable name="topID" select="topLevelID"/> 
    <xsl:for-each select ="secondLevel"> 
     <xsl:variable name="secondID" select="secondLevelID"/> 
     <xsl:for-each select="thirdLevel">    
      <fo:block-container position="absolute" height="12.8pt" width="220.8pt" left="160pt" display-align="auto"> 
       <xsl:attribute name="top"> 
        <xsl:value-of select="concat(193 + [whatshouldgohere]), 'pt')"/> 
       </xsl:attribute> 
       <fo:block font-size="7pt">       
        <xsl:call-template name="insertThirdLevel"/> 
       </fo:block> 
      </fo:block-container> 
     </xsl:for-each> 
    </xsl:for-each> 
</xsl:for-each> 

같다. 추가/ID 곱하기 조합을 사용하여 시도했다 (1에서 시작하여 각 집합에 대해 1 씩 증가) 및 position(),하지만 나는 그것을 올바르게 얻을 수 없습니다.

+0

"CONCAT은 ((193 * 위치())"PT는 ') "작동해야 방법 곱셈을하고 있었나요? – annakata

+0

내가 겪었던 문제는 기본적으로 3 가지 다른 포지션을 사용할 수 있다는 것입니다. 또한 XML에서 데이터가 배치되는 방식에서 position()을 사용하면 다른 텍스트 위에 텍스트가 출력되는 것처럼 보입니다. – bcasp

답변

2

나는 당신이 정말로 <xsl:apply-templates>을 들여다 봐야한다고 생각한다. 많은 타이핑을 줄일 수있다.

단순화 된 버전 :

<xsl:variable name="line-height" select="10" /> 

<xsl:template match="/records"> 
    <xsl:apply-templates select="//thirdLevel" /> 
</xsl:template> 

<xsl:template match="thirdLevel"> 
    <xsl:variable name="top" select="193 + position() * $line-height" /> 
    <fo:block-container top="{concat($top , 'pt')}"> 
    <fo:block font-size="7pt">       
     <xsl:call-template name="insertThirdLevel"/> 
    </fo:block> 
    </fo:block-container> 
</xsl:template> 

<xsl:template name="insertThirdLevel"> 
    Third Level! 
</xsl:template> 

단순화 출력 (스페이스 "fo를"제외)

<fo:block-container top="203pt"> 
    <fo:block font-size="7pt"> 
    Third Level! 
    </fo:block> 
</fo:block-container> 
<fo:block-container top="213pt"> 
    <fo:block font-size="7pt"> 
    Third Level! 
    </fo:block> 
</fo:block-container> 
<fo:block-container top="223pt"> 
    <fo:block font-size="7pt"> 
    Third Level! 
    </fo:block> 
</fo:block-container> 
<fo:block-container top="233pt"> 
    <fo:block font-size="7pt"> 
    Third Level! 
    </fo:block> 
</fo:block-container> 
+0

고마워요! 나는 이것을 지나치게 생각하고 있었다. 나를 위해 그것을 단순화 주셔서 감사합니다. – bcasp

+0

이제 빠릅니다. 천만에요. :-디 – Tomalak