如何在 XSL-FO 中正确插入一个空行?

How to insert a blank line in XSL-FO properly?

我正在想办法正确地做到这一点。我尝试在代码中使用处理指令,但它们似乎完全被忽略了。

文中:

end of a paragraph.<?linebreak?></p>

至于模板,我试过:

<xsl:template match="processing-instruction('linebreak')">
    <fo:block>
        <xsl:apply-templates/>
        <fo:leader/>
    </fo:block>
</xsl:template>

或仅用于测试目的:

<xsl:template match="processing-instruction('linebreak')">
    <fo:block>XXXX</fo:block>
</xsl:template>

无论我做什么,模板都不会被使用。

我在 eXist-db 应用程序 (3.0RC1) 中使用它,但我认为这与 eXist-db 无关。有 FOP 1.1。我不确定撒克逊版本。

传统上,您不会在段落末尾插入换行符。相反,您指定例如space-below="12pt" 在包含该段落的 fo:block 上。

总是会插入换行符,即使您不想要它(例如,当段落位于页面底部并且换行符会换行到下一页时。space -below 可以是有条件的,所以如果这个 space 出现在页面底部,它会被折叠起来。这会产生更好看的布局。

No matters what I do, the template is never used.

关于这部分问题,一个可能的解释是匹配父元素的模板(<p>在你的例子中)在应用模板时默默地忽略处理指令 .

例如,这个准标识样式表在处理元素时会忽略处理指令,因此永远不会执行它们的匹配模板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:template match="* | @*">
    <xsl:copy>
      <!-- this only processes elements, attributes and text nodes! -->
      <xsl:apply-templates select="* | @* | text()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="processing-instruction('linebreak')">
    XXXXX
  </xsl:template>

</xsl:stylesheet>

为了考虑处理指令,模板匹配元素也必须显式应用模板:

  <xsl:template match="* | @*">
    <xsl:copy>
      <xsl:apply-templates select="* | @* | text() | processing-instruction()"/>
    </xsl:copy>
  </xsl:template>

请注意,使用 <xsl:apply-templates/> 也不起作用,因为它不 select 处理指令或属性,只是元素和文本节点。