我的xsl文件中有多个块,我想在一行中格式化,但如果没有足够的空间 - 块将移动到下一行。目前我有以下 xsl 块:
<fo:static-content flow-name="header-continued">
<fo:block-container>
<fo:block>
<xsl:for-each select="/myroot/category">
<fo:inline>
<xsl:value-of select="name"/>
</fo:inline>
</xsl:for-each>
</fo:block>
</fo:static-content>
</fo:block-container>
目前,如果没有足够的宽度 - 内容只是在左右两侧被切割。我想要的行为类似于HTML标记,当有多个DIV并且它们具有display:inline-block样式时。
给出这个时的一些格式化程序:
<fo:inline>foo</fo:inline><fo:inline>foo</fo:inline><fo:inline>foo</fo:inline><fo:inline>foo</fo:inline><fo:inline>foo</fo:inline>
不会在每个元素之间中断。因此,更改模板以在每个<fo:inline>
之间输出一个中断空格。
见 https://en.wikipedia.org/wiki/Zero-width_space
实体​
喜欢:
<xsl:for-each select="/myroot/category">
<fo:inline>
<xsl:value-of select="name"/>
</fo:inline>
<xsl:text>​</xsl:text>
</xsl:for-each>
这应该在每个<fo:inline>
之间创建一个零宽度的中断空间,以允许它中断多行。
这当然假设你不希望它们之间有空间。
现在,也就是说,在上面的模板中,我会注意到<fo:inline>
元素绝对不做任何事情(除了可能导致您遇到的问题(,因为它们没有单独的样式或任何东西。
我想你会对以下方面感到满意:
<xsl:for-each select="/myroot/category">
<xsl:value-of select="name"/>
</xsl:for-each>
这在现实中是完全相同的。如果您的数据如下所示:
<name>foo</name>
<name>bar</name>
<name>foo</name>
<name>bar</name>
<name>foo</name>
<name>bar</name>
然后你的输出将是:
福
巴福巴福巴然后你可以看到为什么没有休息。
将fo:inline
更改为包含包含名称的fo:block
的fo:inline-container
。
fo:inline-container
将根据需要占用尽可能多的宽度(除非您指定宽度(,并且其中的文本不会在一行上断开(除非它比可用宽度宽(。 请参阅 https://www.w3.org/TR/xsl11/#fo_inline-container。
或者,将<fo:inline>
更改为 <fo:inline keep-together.within-line="always">
。 这应该适用于 FOP 1.1。