XSL1.0,如何在不分割单词的情况下分割字符串



我必须改进XSL中长字符串的拆分。行大小为60个字符。当出现一根相当长的绳子时,它就会以一种不雅的方式分裂成几行。我试图实现照顾空间的机制,以避免在它们中间分割单词。

现在,代码看起来是这样的:

<xsl:template name="split_text">    
<xsl:param name="sText"/>
<xsl:param name="lineSize">60</xsl:param>

<xsl:variable name="toDisplay" saxon:assignable="yes"/>
<xsl:variable name="toProcess" saxon:assignable="yes" select="$sText"/>
<saxon:while test="string-length($toProcess) > $lineSize">
<saxon:assign name="toDisplay" select="substring($toProcess, 1, $lineSize)"/>
<saxon:assign name="toProcess" select="substring($toProcess, $lineSize + 1)"/>
<xsl:value-of select="$toDisplay"/><br/>
</saxon:while>
<xsl:value-of select="$toProcess"/>
</xsl:template>

如果它的长度超过行容量,它只是拆分文本。我想处理线路容量在某些单词中间结束的情况。我读过关于标记器、子字符串等等。但在java中我遇到了一些例外。可能我正在使用太旧的XSL版本,但升级它并非不可能,所以我必须使用我现有的。

我害怕依赖于每一行中最后一次出现的空格字符,因为输入可以是一个没有空格的长字符序列,然后最好的选择仍然是使用我粘贴的代码。在XSL中,标记化是一种简单的方式吗?

我是否应该标记整个字符串,并在其摘要长度小于行容量的情况下附加每个下一个标记?或者,我应该检查行中的最后一个字符是否是空格字符,然后进行一些额外的操作吗?

我很困惑,这是我第一次和XSL约会。

附加编辑:我发现函数saxon:tokenize对我来说很有趣。文档中的描述听起来很棒——这正是我所需要的。但是可以在XSL1.0和Saxon-here中使用Manifest:粘贴

Manifest-Version: 1.0
Main-Class: com.icl.saxon.StyleSheet
Created-By: 1.3.1_16 (Sun Microsystems Inc.)
```.
If yes, how to iterate over that? I found on the web some various styles of iterating and I don't know and don't understand what differences, pros, and cons are between they

好的,我已经完成了,所以我会分享我的解决方案,也许有人会遇到类似的问题。

<xsl:template name="split_text">    
<xsl:param name="sText"/>
<xsl:param name="lineSize">60</xsl:param>

<xsl:variable name="remainder" saxon:assignable="yes"/>
<xsl:variable name="textTokens" saxon:assignable="yes" select="saxon:tokenize($sText)" />
<xsl:choose>
<!-- If line length is fill, then it is printed and remainder is cleared -->
<xsl:when test="(string-length($remainder) >= $lineSize)">
<xsl:value-of select="$remainder"/><br/>
<saxon:assign name="remainder" select="''"/>                
</xsl:when>
<!-- Words are sequentially adding to line until it become filled -->
<xsl:otherwise>
<saxon:assign name="remainder" select="concat($remainder, ' ', $currentToken, ' ')"/>
</xsl:otherwise>
</xsl:choose>           
</xsl:for-each>
</xsl:template>

我使用了saxon的标记化,并开始迭代标记列表,在每个循环后检查行长度。

最新更新