XSL:FO 水平格式,如果不适合,则换行



我的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

实体&#8203;

喜欢:

  <xsl:for-each select="/myroot/category">
   <fo:inline>
     <xsl:value-of select="name"/>
   </fo:inline>
   <xsl:text>&#8203;</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:blockfo: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。

最新更新