我正在使用xslt将.xml文件转换为xsl:fo文件。该文件应为演示文稿。 我想要的是每个页面上的侧边栏包含所有标题的列表(由h1标签定义)。 我得到了这个,但接下来,我想突出显示当前页面或任何上一页的最新标题,如果当前页面不包含标题。
我将页面序列定义如下:
<fo:page-sequence master-reference="Presentation">
<fo:static-content flow-name="xsl-region-start">
<fo:block color="#fff">
<xsl:call-template name="toc" />
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates/>
</fo:block>
</fo:flow>
</fo:page-sequence>
将toc定义如下:
<xsl:template match="toc" name="toc">
<fo:block>
<xsl:for-each select="//h1">
<fo:block font-size="18pt" font-weight="bold" margin-top="0.25cm">
<xsl:if test="is this h1-node the current headline?" >
<xsl:attribute name="color">red</xsl:attribute>
</xsl:if>
<fo:basic-link internal-destination="{generate-id(.)}">
<xsl:number format="1. " count="//h1" level="any"/>
<xsl:value-of select="."/>
</fo:basic-link>
</fo:block>
</xsl:for-each>
</fo:block>
</xsl:template>
我曾尝试使用preciding-sibling :: h1,但这在静态内容中不起作用。 我也尝试用fo:marker来解决它,但是fop的标记,所以在xsl转换之后。 换句话说,有没有办法根据页面或甚至页面内容的不同,在静态内容中格式化块? 提前谢谢!
答案 0 :(得分:1)
首先,您必须在静态内容检索标记中表示整个TOC,TOC的每个条目都有一个标记。没有任何条件逻辑,只需按照您想要的顺序检索所有标记。
然后,在您的流程中,首先将所有标记定义为未突出显示的内容。
然后,在您的流程中,当您到达每个部分时,启动该部分并将该部分的标记重新定义为突出显示的内容,然后当您到达该部分的末尾时,将该部分的标记重新定义为未突出显示的内容。 / p>
您需要记住的是,在静态内容中检索标记是无条件的,而在流中定义标记是有条件的。您错误地尝试将条件逻辑放入静态内容中,这对您无效。