未保留 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


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 存在一些问题:
- 不需要将文本包含在
xsl:text
元素中,因为这些文本节点不仅仅由空白字符组成,因此永远不会被剥离(请参阅Whitespace stripping 了解更多详情)
- 出于同样的原因,没有必要使用
xsl:preserve-space
和xsl:strip-space
,当然除非您出于其他原因需要它们
- 在从 XML 到 XSL-FO 的转换中保留换行符只是(必需的)第一步,但是您必须在处理 XSL-FO 文件期间保留它们;为此,您必须使用
linefeed-treatment
属性:linefeed-treatment="preserve"
- 文字换行相当于


实体,因此在您的输入中,您在 "Static" 和 "text" 之间有 3 个换行符,保存时会产生两个空行;如果那不是你想要的,你必须删除其中的一些
- 单词 "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>
出于某种原因,在 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


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 存在一些问题:
- 不需要将文本包含在
xsl:text
元素中,因为这些文本节点不仅仅由空白字符组成,因此永远不会被剥离(请参阅Whitespace stripping 了解更多详情) - 出于同样的原因,没有必要使用
xsl:preserve-space
和xsl:strip-space
,当然除非您出于其他原因需要它们 - 在从 XML 到 XSL-FO 的转换中保留换行符只是(必需的)第一步,但是您必须在处理 XSL-FO 文件期间保留它们;为此,您必须使用
linefeed-treatment
属性:linefeed-treatment="preserve"
- 文字换行相当于


实体,因此在您的输入中,您在 "Static" 和 "text" 之间有 3 个换行符,保存时会产生两个空行;如果那不是你想要的,你必须删除其中的一些 - 单词 "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>