我有一些XML数据和一个XSL FO样式表来格式化XML。我有以下XML文档:
<Content>
<Para>Paragraph One.</Para>
<Para />
<Para>Paragraph Two.</Para>
<Para />
<Para>Paragraph Three.</Para>
</Content>
使用FO样式表进行样式化后的期望输出是:
Paragraph One.
Paragraph Two.
Paragraph Three.
我得到的实际输出如下,总是有两个空行。
Paragraph One.
Paragraph Two.
Paragraph Three.
我使用的样式表代码是:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:variable name="NewLine">
<xsl:text> </text>
</xsl:variable>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="pageSetup">
<fo:region-body region-name="xsl-region-body" />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="pageSetup">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates />
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="Para">
<fo:block
linefeed-treatment="preserve"
white-space-collapse="false">
<xsl:choose>
<xsl:when test="text() != ''">
<xsl:value-of select="text()" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$NewLine" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
获取块间空间的常规方法是使用space-before
(https://www.w3.org/TR/xsl11/#space-before)和/或space-after
(https://www.w3.org/TR/xsl11/#space-after)属性。
如果您打算在XML中坚持使用空的Para
元素,您可以忽略它们并使用space-after
,将Para
的模板替换为:
<xsl:template match="Para[text()]">
<fo:block space-after="1em">
<xsl:apply-templates />
</fo:block>
</xsl:template>