带有fop 2.2的无空格换行符,但保留空白=“ pre”以管理用户手动缩进的文本

时间:2019-07-12 12:24:16

标签: xslt apache-fop

我正在尝试在Fop 2.2的文本中管理空格处理。

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

linefeed-treatment="preserve"允许在pdf页面末尾使用正确的换行符,并保留白线。太好了

问题是我必须允许用户包括手动缩进的文本并正确地对其进行管理。这是一个示例:

  
      
  1. 测试1
  2.   
     

___ 1.1。测试2

     

___ 1.2。测试3

     

______ 1.2.1。测试4

     

___ 1.3。测试5

     
      
  1. 测试6
  2.   

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

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

我正在尝试找到一种可以同时管理两种情况的解决方案,但我找不到任何解决方法。

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

实际上,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

这是我在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>

1 个答案:

答案 0 :(得分:0)

根据@TonyGraham的建议,我对textarea进行了解析,因此能够逐行处理。这是我使用的代码:

<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>