XSL-FO:可以使用标记来存储任何内容吗?

时间:2015-12-04 02:51:11

标签: xml xslt xsl-fo dita

这个问题是XSL-FO部分,XSLT部分和DITA部分。一般来说,这个问题是尝试解决我在fo:marker做错的事情,并了解我的尝试是否可行。

我正在尝试使用fo:标记来存储特定元素的文本,然后像您期望的那样在标题中检索该文本。我这是作为DITA插件的一部分的自定义样式表的一部分。我们的想法是插件用于列出程序的一系列步骤的文档。这些程序的步骤通常包括一堆图片。因此,要求是当页面中的步骤中断时,该步骤的第一个句子充当排序的运行标题。在DITA中,步骤的第一个句子在cmd元素中捕获。所以,我的想法是我可以设置用cmd处理fo:marker元素的模板。

以下是cmd的模板与我添加的标记相似的内容:

<xsl:template match="*[contains(@class, ' task/cmd ')]" priority="1">
    <fo:block xsl:use-attribute-sets="cmd">                     
        <xsl:call-template name="commonattributes"/>             
        <xsl:if test="../@importance='optional'">
            <xsl:call-template name="insertVariable">
                <xsl:with-param name="theVariableID" select="'Optional Step'"/>
            </xsl:call-template>
            <xsl:text> </xsl:text>
        </xsl:if>
        <fo:inline>
            <fo:marker marker-class-name="current-step"/>
        </fo:inline>
        <xsl:apply-templates/>            
    </fo:block>
</xsl:template>

这不起作用。我对此进行了一些讨论,当我修改了这样的模板时,我只能在info元素上工作,这是cmd的兄弟:

<xsl:template match="*[contains(@class, ' task/info ')]">
    <fo:block xsl:use-attribute-sets="info">    
        <fo:inline>
            <fo:marker marker-class-name="current-step">
                <xsl:apply-templates/>
            </fo:marker>
        </fo:inline>
        <xsl:call-template name="commonattributes"/>            
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>

问题是,我尝试使用cmd元素进行此构造(即包含apply-templates指令),但它仍然没有产生任何内容。

我描述的内容是否可行以及为什么我的标记仅在我包含apply-templates指令且仅适用于info元素时才有效?

1 个答案:

答案 0 :(得分:2)

你需要fo:marker内的某些东西,因为它是fo:marker的内容“可以从fo:static-content ...中使用fo:retrieve-marker”检索和格式化。见http://www.w3.org/TR/xsl11/#fo_marker

我不知道为什么带有内容且具有相同标记类名称的fo:marker在两个上下文中都不起作用。您在retrieve-position="first-including-carryover"上使用fo:retrieve-marker了吗?您是否已fo:marker留在info,以便屏蔽fo:marker的{​​{1}}?

完全独立的替代方案可能是将每个步骤放在没有边框的单列表中,并将cmd的内容放在表格标题中。