嗨,如何在段落中实现长字符串的分词,我们正在使用Apache FOP在我们的应用程序中生成PDF

Hi, how to implement word break for long strings in a paragraph, we are using Apache FOP for PDF generation in our application

提问人:Kartheek Gajavelly 提问时间:10/5/2023 更新时间:10/6/2023 访问量:24

问:

“要求是以表格形式打印数据,每当有大于列宽的长字符串时,它就会从列中出来,我们就会面临文本重叠问题。我们有两种类型的数据来自我们的应用程序 UI。

  1. 文本字段数据 - 我们已经成功地为此类数据实现了分词。
  2. RTE(富文本编辑器)数据 - 我们尝试实现相同的方法,但数据要么多次打印,要么根本不打印,这也影响了文本的样式。根本原因是 RTE 数据带有 html 段落、span 和样式标签,如 strong、u 标签。

下面的这段代码用于根据列宽来分解单词。但这不适用于带有 html 标签的数据。

  <xsl:template name="intersperse-with-zero-spaces">
    <xsl:param name="str"/>
    <xsl:param name="column-width"/>
    <xsl:if test="string-length($str) &gt; 0">
        <xsl:variable name="s1" select="substring-before($str, ' ')"/>
        <xsl:variable name="s2" select="substring-after($str, ' ')"/>
        <xsl:variable name="chars-per-inch" select="number($column-width*6)" />
        <xsl:if test="$s1 != '' and string-length($s1) &lt; $chars-per-inch">
            <xsl:value-of select="$s1" />
        </xsl:if>
        <xsl:if test="$s1 != '' and string-length($s1) &gt;= $chars-per-inch">
            <xsl:call-template name="intersperse-with-zero-spaces-str">
                <xsl:with-param name="str" select="$s1"/>
            </xsl:call-template>
        </xsl:if>
        <!-- Adding space after every word -->
        <xsl:text> </xsl:text>
        <xsl:call-template name="intersperse-with-zero-spaces">
                <xsl:with-param name="str" select="$s2"/>
                <xsl:with-param name="column-width" select="$column-width"/>
        </xsl:call-template>
    </xsl:if>
  </xsl:template>
  
  <xsl:template name="intersperse-with-zero-spaces-str">
    <xsl:param name="str"/>
    <xsl:variable name="spacechars">&#x9;&#xA;&#x2000;&#x2001;&#x2002;&#x2003;&#x2004;&#x2005;&#x2006;&#x2007;&#x2008;&#x2009;&#x200A;&#x200B;</xsl:variable>
    <xsl:if test="string-length($str) &gt; 0">
      <xsl:variable name="c1" select="substring($str, 1, 1)" />
      <xsl:variable name="c2" select="substring($str, 2, 1)" />
      <xsl:value-of select="$c1"/>
      <xsl:if test="$c2 != '' and not(contains($spacechars, $c1) or contains($spacechars, $c2))">
        <xsl:text>&#x200B;</xsl:text>
      </xsl:if>
      <xsl:call-template name="intersperse-with-zero-spaces-str">
        <xsl:with-param name="str" select="substring($str, 2)"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
    
XML XSLT XSLT-1.0 apache-fop

评论

1赞 Siebe Jongebloed 10/6/2023
请分享 een minimal xml-example

答:

0赞 Siebe Jongebloed 10/6/2023 #1

如果你的 element() 包含 html-markup,我想你需要从你的元素 () 中的每个 text-node() 调用该模板,如下所示:

  <xsl:template match="containerElementThatShouldNotGetToWide//text()">
    <xsl:call-template name="intersperse-with-zero-spaces">
      <xsl:with-param name="column-width" select="'12345'"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="intersperse-with-zero-spaces">
    <xsl:param name="str" select="."/>
    <xsl:param name="column-width"/>