在使用<xsl:value-of>的XSL FO生成的PDF中插入换行符

Zko*_*koh 21 xslt xsl-fo

我正在使用XSL FO生成包含信息表的PDF文件.其中一列是"描述"列.我填充其中一个Description字段的字符串示例如下:

This is an example Description.<br/>List item 1<br/>List item 2<br/>List item 3<br/>List item 4
Run Code Online (Sandbox Code Playgroud)

在与此描述对应的表格单元格内,我希望输出显示如下:

This is an example Description.
List item 1
List item 2
List item 3
List item 4
Run Code Online (Sandbox Code Playgroud)

我从其他地方搜索过,你可以使用<fo:block></fo:block>另一个<fo:block>元素在XSL FO中进行换行.因此,甚至在我用我的XSL样式表解析XML之前,我会替换所有出现的<br/>with <fo:block/>,以便字符串的文字值现在看起来像:

This is an example Description.<fo:block/>List item 1<fo:block/>List item 2<fo:block/>List item 3<fo:block/>List item 4
Run Code Online (Sandbox Code Playgroud)

当我使用的描述字符串使用时获得问题<xsl:value-of>,例如如下:

<fo:block>
    <xsl:value-of select="descriptionStr"/>
</fo:block>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,输出到我的PDF文档的值是文字值,因此它看起来与上一个包含所有<fo:block/>文字的示例完全相同.我已经尝试<fo:block/>在另一个字符串的中间手动硬编码,并且它正确显示.例如,如果我在样式表中写入:

<fo:block>Te<fo:block/>st</fo:block>
Run Code Online (Sandbox Code Playgroud)

它将正确显示为:

Te
st
Run Code Online (Sandbox Code Playgroud)

但是当<fo:block/>它在<xsl:value-of select=""/>语句的值内时似乎不会发生.我试过在SO以及Google等上搜索这个都无济于事.任何建议或帮助将不胜感激.谢谢!

Dan*_*ley 40

您也可以替换<br/>使用&#xA;和添加linefeed-treatment="preserve"属性的<fo:block>.

就像是:

<fo:block linefeed-treatment="preserve">This is an example Description.&#xA;List item 1&#xA;List item 2&#xA;List item 3&#xA;List item 4</fo:block>
Run Code Online (Sandbox Code Playgroud)

编辑

有些用户可能需要使用\n而不是&#xA;依赖于他们如何创建XML.请参阅保留 在xml编组期间获取更多详细信息.


小智 8

这对我有帮助,应该是最简单的解决方案(使用Apache FOP 1.1):

为什么不用<br/>称为行分隔符的 Unicode字符替换.

   <xsl:template match="br">
      <xsl:value-of select="'&#x2028;'"/>
   </xsl:template>
Run Code Online (Sandbox Code Playgroud)

请参阅https://en.wikipedia.org/wiki/Newline#Unicode

  • 仅使用 `
` 对我有用,这是迄今为止最简单的方法,并且不会干扰为可读性而插入的换行符。 (2认同)

小智 6

以下代码有效:

<fo:block white-space-collapse="false" 
    white-space-treatment="preserve" 
    font-size="0pt" line-height="15px">.</fo:block>
Run Code Online (Sandbox Code Playgroud)

它使xsl处理器认为这个块包含一行文本,实际上有0pt的字体大小.您可以通过提供自己的值来自定义行高.


小智 5

您不应该使用xsl:value-of指令,xsl:apply-templates而是:对于文本节点的内置规则将只输出它们的字符串值,对于空br元素,您可以声明规则匹配descriptionStr/brdescriptionStr//br(根据您的输入)以转换为空fo:block.