문제

직장에서 나는 XSL로 PDF를 생성하는 재미있는 임무를 받았습니다. 내가 작업하고있는 XML 구조는 비슷합니다

<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 구조를 사용하면 PDF의 텍스트 블록을 모든마다 출력해야합니다. thirdLevel 마디. 내가 지금까지 가지고있는 XSL은 같다

<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>

기본적으로 각각의 텍스트를 만들려면 상단 속성에 약간의 값을 추가해야합니다. thirdLevel 노드는 자체 라인에 나타납니다. ID를 추가/곱하는 조합을 사용해 보았습니다 (1에서 시작하여 각 세트에 대해 1 씩 증가 함). position(), 그러나 나는 그것을 제대로 얻을 수없는 것 같습니다.

도움이 되었습니까?

해결책

나는 당신이 정말로 조사해야한다고 생각합니다 <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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top