未保留 XSLT 新行

XSLT new lines not being preserved

出于某种原因,在 xslt 之后我的最终 PDF 中没有保留我的空间。我想要的输出是:

静态

正文粗体。

这是我的 xslt 模板:

<xsl:preserve-space elements="*" />
<xsl:strip-space elements="" />

<xsl:template match="coverPage">
    <fo:block font-size="12pt" color="black" text-align="center">
        <xsl:text>
            Static
            &#xA;
            text
        </xsl:text>
    </fo:block>
    <fo:block font-size="12pt" color="black" text-align="center" font-weight="bold">
        <xsl:text>
            bold.
        </xsl:text>
    </fo:block>
</xsl:template>

我认为您的 XSLT 存在一些问题:

  1. 不需要将文本包含在 xsl:text 元素中,因为这些文本节点不仅仅由空白字符组成,因此永远不会被剥离(请参阅Whitespace stripping 了解更多详情)
  2. 出于同样的原因,没有必要使用xsl:preserve-spacexsl:strip-space,当然除非您出于其他原因需要它们
  3. 在从 XML 到 XSL-FO 的转换中保留换行符只是(必需的)第一步,但是您必须在处理 XSL-FO 文件期间保留它们;为此,您必须使用linefeed-treatment属性linefeed-treatment="preserve"
  4. 文字换行相当于 &#xA; 实体,因此在您的输入中,您在 "Static" 和 "text" 之间有 3 个换行符,保存时会产生两个空行;如果那不是你想要的,你必须删除其中的一些
  5. 单词 "text" 和 "bold" 位于两个不同的 fo:block 元素中,因此这意味着它们将始终在不同的行上;如果您希望它们并排放置,这些词必须位于 fo:inline 元素内 (并且必须有一个外部 fo:block 来包含它们)

最后一句警告

查看 FO 文件时 保留的换行符和忽略的换行符之间的区别不会立即显现出来,因为它归结为存在 linefeed-treatment祖先元素中的属性(可能离文本节点本身很远)。

在特定位置强制换行的更清晰的方法包括:

  • 使用不同的 fo:block 元素,每个元素包含应创建一行(或多行)的文本
    <fo:block>Static</fo:block>
    <fo:block>text <fo:inline font-weight="bold">bold.</fo:inline></fo:block>
  • 在应该换行的地方使用空 fo:block
    <fo:block>
        Static
        <fo:block/>
        text <fo:inline font-weight="bold">bold.</fo:inline>
    </fo:block>