静态内容中的XSL-FO格式取决于位置

时间:2013-10-29 12:34:25

标签: xml xslt format apache-fop

我正在使用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转换之后。 换句话说,有没有办法根据页面或甚至页面内容的不同,在静态内容中格式化块? 提前谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您必须在静态内容检索标记中表示整个TOC,TOC的每个条目都有一个标记。没有任何条件逻辑,只需按照您想要的顺序检索所有标记。

然后,在您的流程中,首先将所有标记定义为未突出显示的内容。

然后,在您的流程中,当您到达每个部分时,启动该部分并将该部分的标记重新定义为突出显示的内容,然后当您到达该部分的末尾时,将该部分的标记重新定义为未突出显示的内容。 / p>

您需要记住的是,在静态内容中检索标记是无条件的,而在流中定义标记是有条件的。您错误地尝试将条件逻辑放入静态内容中,这对您无效。