提问人:Kartheek Gajavelly 提问时间:10/5/2023 更新时间:10/6/2023 访问量:24
嗨,如何在段落中实现长字符串的分词,我们正在使用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
问:
“要求是以表格形式打印数据,每当有大于列宽的长字符串时,它就会从列中出来,我们就会面临文本重叠问题。我们有两种类型的数据来自我们的应用程序 UI。
- 文本字段数据 - 我们已经成功地为此类数据实现了分词。
- 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) > 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) < $chars-per-inch">
<xsl:value-of select="$s1" />
</xsl:if>
<xsl:if test="$s1 != '' and string-length($s1) >= $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">	
           ​</xsl:variable>
<xsl:if test="string-length($str) > 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>​</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>
答:
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"/>
评论