fo:inline-元素创建不需要的空格
fo:inline-elements create unwanted whitespace
我从一个 XML 文件(最初是一个 Word 文件)创建一个包含 XSLT 和 XSLFO 的 PDF。应采用粗体字。这可行,但 PDF 包含粗体字中不需要的 space(请参阅“不需要的结果”)。原因是 fo:inline
在 fo:block
中创建了 space(Word 莫名其妙地将一些单词拆分成几个 w:t
元素)。渲染器是 FOP。
我不知道如何关闭生成白色space。我已经尝试了一些白色的 space 设置,例如 xsl:strip-space elements
和 white-space-collapse
,但没有成功。
为什么样式表在 fo:inline
之间创建白色 space,我该如何解决这个问题?
不需要的结果
来自 PDF:“... weil Fi l mmaterial in der ...”
想要的结果
应该是:“... weil Filmmaterial in der ...”
SOURCE,为了清楚起见,用一些元素(不重要的)缩短了
<div class="listlevel-1">
<w:p>
<w:r>
<w:t>... weil </w:t>
</w:r>
<w:r>
<w:t>Fi</w:t>
</w:r>
<w:r>
<w:t>l</w:t>
</w:r>
<w:r>
<w:t>mmaterial</w:t>
</w:r>
<w:r>
<w:t> in der digitalen ...</w:t>
</w:r>
</w:p>
</div>
XSLT-Stylesheet,为了清楚起见,用一些元素(不重要的)缩短了
2 个 XSLT 样式表在转换过程中交织在一起。问题发生在列表中。一个样式表转换列表 (1),第二个转换所有粗体、斜体或下划线的文本元素(w:t 元素)。
1)
<xsl:template match="//div[@class = 'listlevel-1']/w:p">
<fo:list-item xsl:use-attribute-sets="listitem">
<fo:list-item-label xsl:use-attribute-sets="itemlabel">
<fo:block>•</fo:block>
</fo:list-item-label>
<fo:list-item-body xsl:use-attribute-sets="itembody">
<fo:block>
<xsl:apply-templates select="w:r/w:t"/>
</fo:block>
</fo:list-item-body>
</fo:list-item>
</xsl:template>
几个xsl:choose
个分支用于查询几个条件;由于条件 2 和条件 3 的长度,此处未列出,但它们的结构与条件 1 完全相同。
<xsl:template match="//w:t">
<xsl:choose>
<xsl:when test="../w:rPr/w:b">
<xsl:choose>
<xsl:when test="../w:rPr/w:u">
<xsl:choose>
<xsl:when test="../w:rPr/w:i">
<fo:inline>
<xsl:attribute name="font-weight">bold</xsl:attribute>
<xsl:attribute name="text-decoration">underline</xsl:attribute>
<xsl:attribute name="font-style">italic</xsl:attribute>
<xsl:apply-templates/>
</fo:inline>
</xsl:when>
<xsl:otherwise>
<fo:inline>
<xsl:attribute name="font-weight">bold</xsl:attribute>
<xsl:attribute name="text-decoration">underline</xsl:attribute>
<xsl:apply-templates/>
</fo:inline>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
</xsl:choose>
</xsl:when>
...
</xsl:choose>
</xsl:template>
FO-File,FO文件中的代码是什么样的:
<fo:block>... weil
<fo:inline font-weight="bold">Fi</fo:inline>
<fo:inline font-weight="bold">l</fo:inline>
<fo:inline font-weight="bold">mmaterial</fo:inline> in ...
</fo:block>
也许你用过:<xsl:output indent="yes" />
.
如果是,请将其更改为 <xsl:output indent="no" />
如果您的来源已经缩进,请使用:<xsl:strip-space elements="w:r"/>
我从一个 XML 文件(最初是一个 Word 文件)创建一个包含 XSLT 和 XSLFO 的 PDF。应采用粗体字。这可行,但 PDF 包含粗体字中不需要的 space(请参阅“不需要的结果”)。原因是 fo:inline
在 fo:block
中创建了 space(Word 莫名其妙地将一些单词拆分成几个 w:t
元素)。渲染器是 FOP。
我不知道如何关闭生成白色space。我已经尝试了一些白色的 space 设置,例如 xsl:strip-space elements
和 white-space-collapse
,但没有成功。
为什么样式表在 fo:inline
之间创建白色 space,我该如何解决这个问题?
不需要的结果
来自 PDF:“... weil Fi l mmaterial in der ...”
想要的结果
应该是:“... weil Filmmaterial in der ...”
SOURCE,为了清楚起见,用一些元素(不重要的)缩短了
<div class="listlevel-1">
<w:p>
<w:r>
<w:t>... weil </w:t>
</w:r>
<w:r>
<w:t>Fi</w:t>
</w:r>
<w:r>
<w:t>l</w:t>
</w:r>
<w:r>
<w:t>mmaterial</w:t>
</w:r>
<w:r>
<w:t> in der digitalen ...</w:t>
</w:r>
</w:p>
</div>
XSLT-Stylesheet,为了清楚起见,用一些元素(不重要的)缩短了
2 个 XSLT 样式表在转换过程中交织在一起。问题发生在列表中。一个样式表转换列表 (1),第二个转换所有粗体、斜体或下划线的文本元素(w:t 元素)。
1)
<xsl:template match="//div[@class = 'listlevel-1']/w:p">
<fo:list-item xsl:use-attribute-sets="listitem">
<fo:list-item-label xsl:use-attribute-sets="itemlabel">
<fo:block>•</fo:block>
</fo:list-item-label>
<fo:list-item-body xsl:use-attribute-sets="itembody">
<fo:block>
<xsl:apply-templates select="w:r/w:t"/>
</fo:block>
</fo:list-item-body>
</fo:list-item>
</xsl:template>
几个xsl:choose
个分支用于查询几个条件;由于条件 2 和条件 3 的长度,此处未列出,但它们的结构与条件 1 完全相同。
<xsl:template match="//w:t">
<xsl:choose>
<xsl:when test="../w:rPr/w:b">
<xsl:choose>
<xsl:when test="../w:rPr/w:u">
<xsl:choose>
<xsl:when test="../w:rPr/w:i">
<fo:inline>
<xsl:attribute name="font-weight">bold</xsl:attribute>
<xsl:attribute name="text-decoration">underline</xsl:attribute>
<xsl:attribute name="font-style">italic</xsl:attribute>
<xsl:apply-templates/>
</fo:inline>
</xsl:when>
<xsl:otherwise>
<fo:inline>
<xsl:attribute name="font-weight">bold</xsl:attribute>
<xsl:attribute name="text-decoration">underline</xsl:attribute>
<xsl:apply-templates/>
</fo:inline>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
</xsl:choose>
</xsl:when>
...
</xsl:choose>
</xsl:template>
FO-File,FO文件中的代码是什么样的:
<fo:block>... weil
<fo:inline font-weight="bold">Fi</fo:inline>
<fo:inline font-weight="bold">l</fo:inline>
<fo:inline font-weight="bold">mmaterial</fo:inline> in ...
</fo:block>
也许你用过:<xsl:output indent="yes" />
.
如果是,请将其更改为 <xsl:output indent="no" />
如果您的来源已经缩进,请使用:<xsl:strip-space elements="w:r"/>