在工作中,我获得了使用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>
基本上,我需要在top属性中添加一些值,以使每个thirdLevel
节点的文本显示在它自己的行上。我已尝试使用添加/乘以ID的组合(从1开始,每组增加1)和position()
,但我似乎无法正确使用。
答案 0 :(得分: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>