xsl:fo内联换行和换行符

时间:2015-03-18 09:08:46

标签: xsl-fo apache-fop

我正在与我的xsl:fo(Apache Fop 1.1)挣扎。 我试图生成一个带有内嵌图像的块和可能包含换行符的内联文本元素。

<fo:block>
    <fo:inline>First Line&#10;Second Line, Image: </fo:inline>
    <fo:inline>
        <fo:external-graphic scaling="non-uniform" content-height="scale-to-fit" content-width="4mm" height="4mm" src="data:image;base64,iVBORw0KGgoAAAANSUhEUgAAAGcAAABfCAIAAAB6Ck5uAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA0SURBVHhe7cGBAAAAAMOg+VNf4QBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCoAXMKAAFau+l4AAAAAElFTkSuQmCC"/>
    </fo:inline>
    <fo:inline> some more Text on Line 2&#10;3rd Line</fo:inline>
</fo:block>

我希望输出为

FirstLine
SecondLine, Image: || some more Text on Line 2
3rd Line

我得到的是:

FirstLine SecondLine, Image: || some more Text on Line 2 3rd Line

我现在玩了一段时间,在fo:block元素和/或fo:inline元素上使用以下属性会产生奇怪或意外的结果。

white-space-collapse="false" 
white-space-treatment="preserve" 
linefeed-treatment="preserve"

有什么建议吗?

编辑1: 将内联元素更改为像这样的块

<fo:block white-space-treatment="ignore">
    <fo:block white-space="pre">First Line&#xA;Second Line, Image: </fo:block>
    <fo:block>
        <fo:external-graphic scaling="non-uniform" content-height="scale-to-fit" content-width="4mm" height="4mm" src="data:image;base64,iVBORw0KGgoAAAANSUhEUgAAAGcAAABfCAIAAAB6Ck5uAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA0SURBVHhe7cGBAAAAAMOg+VNf4QBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCoAXMKAAFau+l4AAAAAElFTkSuQmCC"/>
    </fo:block>
    <fo:block white-space="pre"> some more Text on Line 2&#10;3rd Line</fo:block>
</fo:block>

给出了元素中预期的包装,但是为每个块生成了一个新行,这不是我试图存档的内容。

2 个答案:

答案 0 :(得分:15)

换行符可以作为换行符或数字字符实体(&#x000A;&#10;)存在于FO文档中;以下FO块完全等效:

<fo:block>Before the linefeed&#x000A;after the linefeed.</fo:block>

<fo:block>Before the linefeed
after the linefeed.</fo:block>

换行符的默认处理包括:

  1. 转换为普通空格;
  2. 将其与其他相邻空格折叠
  3. 这解释了为什么您的初始输入会产生一个输出,其中所有内容块连续放在同一行上。

    使用属性linefeed-treatment="preserve"保留两种形式的换行符,line building process将尊重它们(它们被称为强制换行符)。请注意, linefeed-treatment仅适用于fo:block元素;它对fo:inline元素没有影响。

    你的“编辑1”块有比你需要更多的换行符,因为“......第二行,图像:”,图像和“第2行的一些文本......”在三个不同的{{ 1}}元素,每个块生成自己的行。

    解决方案1:

    获得所需输出的最简单方法可能就是这个,只有一个fo:block保留了换行符(这只是你的原始输入,删除了不必要的fo:block并将所有内容放在上面同一行:

    fo:inline

    请注意您不能缩进此代码,因为额外的换行也会出现在输出中!

    解决方案2:

    第二个解决方案,不涉及使用<fo:block linefeed-treatment="preserve">First Line&#xA;Second Line, Image: <fo:external-graphic scaling="non-uniform" content-height="scale-to-fit" content-width="4mm" height="4mm" src="data:image;base64,iVBORw0KGgoAAAANSUhEUgAAAGcAAABfCAIAAAB6Ck5uAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA0SURBVHhe7cGBAAAAAMOg+VNf4QBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCoAXMKAAFau+l4AAAAAElFTkSuQmCC"/> some more Text on Line 2&#10;3rd Line</fo:block> 属性并创建更易于阅读的代码,将使用空块而不是强制换行:

    linefeed-treatment

    由于不保留换行符,我们可以自由使用它们:

    <fo:block>
        First Line<fo:block/>Second Line, Image: 
        <fo:external-graphic scaling="non-uniform" content-height="scale-to-fit" content-width="4mm" height="4mm" src="data:image;base64,iVBORw0KGgoAAAANSUhEUgAAAGcAAABfCAIAAAB6Ck5uAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAA0SURBVHhe7cGBAAAAAMOg+VNf4QBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHCoAXMKAAFau+l4AAAAAElFTkSuQmCC"/> 
        some more Text on Line 2<fo:block/>3rd Line
    </fo:block>
    

    空块分区外部块的内容,而不在输出中创建任何内容。

答案 1 :(得分:2)

刚刚在FOP 1536的评论中找到答案。

现在我正在使用

linefeed-treatment="preserve"
块元素上的

我在xsl中使用一些unicode魔法替换文本内联中的所有空格:

replace(@text, ' ', '&#x00A0;&#x200B;') 

编辑1: 为了更精确一点,这是我正在使用的xsl的相关部分:

<!DOCTYPE xsl:stylesheet [ 
    <!ENTITY nbsp "&#160;">
    <!ENTITY ZeroWidthSpace "&#x200B;"> 
]>

<fo:block linefeed-treatment="preserve">
    <fo:inline><xsl:value-of select="replace(@text, ' ', '&nbsp;&ZeroWidthSpace;')"/></fo:inline>
</fo:block>

通过这种方法,我可以获得一个非常干净的缩进xml,同时完全控制换行符和空格。