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

XSL:FO horizontal formatting, new line if doesn't fit

我的 xsl 文件中有多个块,我想将其格式化为一行,但万一没有足够的 space - 块将移动到下一行。 目前我有以下 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>

目前,如果没有足够的宽度 - 内容只会在左侧和右侧被剪切。 当有多个 DIV 并且它们具有 display:inline 块样式时,我想要的行为类似于 HTML 标记。

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。

一些格式化程序给出这个:

<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>.

之间输出中断 space

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> 之间创建一个零宽度分隔符 space 以允许它分隔多行。

这当然假设您不希望它们之间有 space。

也就是说,在上面的模板中,我会注意到 <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>

那么你的输出将是:

foobarfoobarfoobar

然后你就会明白为什么没有休息了。