XSL-FO: fo:marker 可以用来存储任何东西吗?

Posted

技术标签:

【中文标题】XSL-FO: fo:marker 可以用来存储任何东西吗?【英文标题】:XSL-FO: Can fo:marker be used to store anything? 【发布时间】:2016-03-08 21:35:54 【问题描述】:

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

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

这是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 指令),但它仍然没有产生任何结果。

我所描述的是否可能?为什么我的标记仅在我包含应用模板指令且仅适用于 info 元素时才有效?

【问题讨论】:

【参考方案1】:

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

我不知道为什么带有内容和相同标记类名称的fo:marker 在这两种情况下都不起作用。你在fo:retrieve-marker 上使用retrieve-position="first-including-carryover" 吗?您是否在 fo:marker 中留下了 info 以掩盖 fo:marker 中的 cmd

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

【讨论】:

感谢@tony 的反馈。实际上,我确实首先尝试将其作为表格标题,但是这很复杂,因为我已经在使用表格来了解如何构建步骤本身。其他要求之一是步骤的图像需要与相关指令并排存在。我认为使用标记可以完成我想要的,而不会过多地损害步骤结构。一般来说,你会说使用标题或标记是我可以完成我正在尝试的唯一现实的方式吗? 您可以将fo:table 放在fo:table-cell 中,但是由于您已经在使用表格,您可能可以将标记和表格结合起来并使用`fo:retrieve-table-marker (w3.org/TR/xsl11/#fo_retrieve-table-marker)检索当前表中的标记集。 谢谢托尼。根据您的反馈,我能够弄清楚我是如何错误地使用 fo:marker 的。

以上是关于XSL-FO: fo:marker 可以用来存储任何东西吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSL-FO 在 .NET 中生成 PDF

有免费的 XSL-FO 编辑器吗? [关闭]

XSL-FO

PDF 中的 XSL-FO 超链接 - 打印关闭查看打开 - 天线之家

带有分页符和动态内容的 XSL-FO 动态表格宽度

XSLT 和 XSL-FO 有啥区别?