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: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。
一些格式化程序给出这个:
<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
实体是​
喜欢:
<xsl:for-each select="/myroot/category">
<fo:inline>
<xsl:value-of select="name"/>
</fo:inline>
<xsl:text>​</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
然后你就会明白为什么没有休息了。
我的 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: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。
一些格式化程序给出这个:
<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>
之间创建一个零宽度分隔符 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
然后你就会明白为什么没有休息了。