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

时间:2017-03-07 13:55:33

标签: xslt xsl-fo

我正在试图弄清楚如何正确地做到这一点。我试图在代码中使用处理指令,但似乎它们在某种程度上被忽略了。

在文中:

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。我不确定撒克逊版本。

2 个答案:

答案 0 :(得分:3)

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

总是会插入换行符,即使您不想要它(例如,当段落放在页面底部并且换行符将换行到下一页时。下面的空格可以是有条件的,如果它出现在页面底部,则该空间将被折叠。这样可以使布局更好看。

答案 1 :(得分:2)

  

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

关于这部分问题,可能的解释是匹配父元素的模板(示例中为<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/>也无法正常工作,因为它不会选择处理指令或属性,只会选择元素和文本节点。