没有 space 的换行符和 fop 2.2 但保留 white-space="pre" 来管理用户手动缩进的文本

Line-break without space with fop 2.2 but keeping white-space="pre" to manage user manually indented text

我正在尝试在 Fop 2.2 中管理文本中的白色 space 处理。

文本区域包括长句和手动缩进的文本。

linefeed-treatment="preserve" 允许在 pdf 页面末尾有一个正确的换行符并保留白行。这很棒。

问题是我必须允许用户包含手动缩进的文本并正确管理它。这是一个例子:

  1. Test 1

___1.1. Test 2

___1.2. Test 3

______1.2.1. Test 4

___1.3. Test 5

  1. Test 6

为了保留缩进文本,我必须使用 white-space="pre",效果很好。

但是,white-space="pre" 的问题是在换行之后,我在下一行的开头有一个 space。

我正在尝试找到一种解决方案来处理这两种情况,但我找不到任何解决方案。

编辑:关于此的更多信息。

实际上,xml 是从一个应用程序生成的,用户可以在其中填充多行文本区域。每个文本区域都可以包含长句和缩进文本。一个文本区域的所有内容都是一个标签。这就是它变得更加困难的原因,因为我必须将两种可能性合二为一 fo:block

这是应用程序生成的 XML 标签:

<TXT_TEST newline="1" title="0" style="txtArea" label="" unformattedLabel="" isModified="0" toPrint="1" indentation="0" xmlStyle="" nextField="">Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. 

Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. 

Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. Ceci est une zone de texte longue avec passage à la ligne forcé. 

Et voici une indentation forcée : 

1. Test
   1.1. Test
      1.1.1. Test
      1.1.2. Test
      1.1.3. Test
   1.2. Test
      1.2.1. Test
2. Test
3. Test</TXT_TEST>

但这是我现在得到的结果的 link,这是不正确的:link

这是我的 xsl 中的 fo 块:

<fo:block linefeed-treatment="preserve" white-space="pre" wrap-option="wrap" font-family="Helvetica" font-size="11pt">
<xsl:value-of select="TXT_TEST/text()"/>
</fo:block>

按照@TonyGraham 的建议,我对文本区域进行了解析,因此我能够逐行处理。这是我使用的代码:

<xsl:template name="split-textarea">
    <xsl:param name="texta" />

    <xsl:choose >
        <xsl:when test="contains($texta,'&#xa;')">  
            <xsl:variable name="textbefore" select="substring-before($texta,'&#xa;')" />
            <xsl:variable name="textafter" select="substring-after($texta,'&#xa;')"/>

            <xsl:choose>
                <xsl:when test="starts-with($textbefore, ' ')">
                    <fo:block wrap-option="wrap" white-space="pre" font-family="Helvetica" font-size="11pt">
                        <xsl:value-of select="$textbefore" />
                    </fo:block>
                </xsl:when>
                <xsl:otherwise>
                    <fo:block wrap-option="wrap" font-family="Helvetica" font-size="11pt">
                        <xsl:choose>
                            <xsl:when test="$textbefore != ''">
                                <xsl:value-of select="$textbefore" />
                            </xsl:when>
                            <xsl:otherwise>
                                <fo:block>&#xA0;</fo:block>
                            </xsl:otherwise>
                        </xsl:choose>
                    </fo:block>
                </xsl:otherwise>
            </xsl:choose>

            <xsl:call-template name="split-textarea">
                <xsl:with-param name="texta" select="$textafter" />
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <fo:block font-family="Helvetica" font-size="11pt">
                <xsl:value-of select="$texta" />
            </fo:block>
            <fo:block>&#xA0;</fo:block>
        </xsl:otherwise>        
    </xsl:choose>       
</xsl:template>