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

时间:2019-02-05 15:13:09

标签: xml xslt 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>

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

2 个答案:

答案 0 :(得分:2)

fo:inline更改为包含包含名称的fo:inline-container的{​​{1}}。

fo:block将采用所需的宽度(除非您指定宽度),并且其中的文本不会超过一行(除非它宽于可用宽度)。参见https://www.w3.org/TR/xsl11/#fo_inline-container


或者,将fo:inline-container更改为<fo:inline>。那应该与FOP 1.1兼容。

答案 1 :(得分:2)

某些格式化程序在给出此提示时:

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

那么您的输出将是:

foobarfoobarfoobar

然后您可以了解为什么没有休息时间。