Pdf 在XSL中为每个

Pdf 在XSL中为每个,pdf,xslt,pdf-generation,xsl-fo,Pdf,Xslt,Pdf Generation,Xsl Fo,在工作中,我被赋予了用XSL生成PDF的有趣任务。我使用的XML结构与 <records> <topLevel> <topLevelID></topLevelID> <secondLevel> <secondLevelID></secondLevelID> <thirdLevel> <

在工作中,我被赋予了用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>

基本上,我需要向top属性添加一些值,以使每个
thirdLevel
节点的文本显示在自己的行中。我尝试过使用ID的加法/乘法(从1开始,每组增加1)和
position()
,但我似乎做得不对。

我认为你应该认真研究
,这样可以节省大量打字

简化版:

<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”命名空间除外):


三级!
三级!
三级!
三级!

“concat((193*position()),'pt')”应该可以工作,你是如何做乘法的?我遇到的问题是,我基本上有三个不同的位置,我可以用于每个级别的三个不同位置。此外,由于数据在XML中的布局方式,仅使用position()似乎有时会导致文本输出在其他文本之上。谢谢!我想得太多了。谢谢你为我简化了它。
<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: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>