xsl:fo内联换行和换行符

Kai*_*Kai 9 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>
Run Code Online (Sandbox Code Playgroud)

我希望输出会是

FirstLine
SecondLine, Image: || some more Text on Line 2
3rd Line
Run Code Online (Sandbox Code Playgroud)

我得到的是:

FirstLine SecondLine, Image: || some more Text on Line 2 3rd Line
Run Code Online (Sandbox Code Playgroud)

我已经玩了一段时间,在fo:block元素和/或fo:inline元素上有以下属性,给出了奇怪或意外的结果.

white-space-collapse="false" 
white-space-treatment="preserve" 
linefeed-treatment="preserve"
Run Code Online (Sandbox Code Playgroud)

有什么建议?

编辑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>
Run Code Online (Sandbox Code Playgroud)

给了我在元素中的预期包装,但是为每个块生成了一个新行,这不是我想要存档的.

lfu*_*ini 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>
Run Code Online (Sandbox Code Playgroud)

换行的默认处理包括:

  1. 它们转换为正常空间;
  2. 它们与其他相邻空间折叠起来.

这就解释了为什么您的初始输入会产生一个输出,其中所有内容块连续放置在同一行上.

使用该属性linefeed-treatment="preserve"保留两种形式的换行符,并且行构建过程将遵循它们(它们被称为强制换行符).请注意,linefeed-treatment仅适用于fo:block元素 ; 它对fo:inline元素没有影响.

您的"编辑1"块有比您需要的更多换行,因为"......第二行,图像:",图像和"第2行的一些文本......"在三个不同的fo:block元素内,每个块都生成自己的线.

解决方案1:

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

解决方案2:

第二个解决方案,不涉及使用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>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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