xsl-list
[Top] [All Lists]

Re: [xsl] Line break algorithm

2020-05-03 04:26:55
If (like me) you find xsl:iterate easier to get right than recursive functions, 
then you could do something like

<xsl:iterate select="tokenize($input)">
  <xsl:param name="line-length" select="0"/>
  <xsl:choose>
     <xsl:when test="$line-length gt 35">
        <break/>
        <xsl:value-of select=". || ' '"/>
        <xsl:next-iteration>
           <xsl:with-param name="line-length" select="string-length(.) + 1"/>
        </xsl:next-iteration>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select=". || ' '"/>
        <xsl:next-iteration>
           <xsl:with-param name="line-length" select="$line-length + 
string-length(.) + 1"/>
        </xsl:next-iteration>
    </xsl:otherwise>
  </xsl:choose>
</xsl:iterate>

Note that a solution using tokenize loses the original separators; if you want 
to retain separators such as multiple spaces or tabs then you'll need to use 
analyse-string instead.

There are probably more concise/elegant solutions using higher-order functions 
and folding, but this one seems easy to read and understand.

Michael Kay
Saxonica


On 3 May 2020, at 01:45, Rick Quatro rick(_at_)rickquatro(_dot_)com 
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:

Hi All, 
 
I have lines in my input that I want to add <break> elements to in my output. 
For example, this might be the input:
 
<xsl:param name="line" select="'Takeoff from Unlisted and Alternate 
Airports'"/>
 
and I want to replace a space with a <break> so that each line doesn't 
exceed, for example, 35 characters
 
<line>Takeoff from Unlisted and Alternate<break/>Airports</line>
 
I am thinking the I can tokenize the line and then recursively build the 
string back up from the beginning, checking its length. Any other suggestions 
on a general-purpose algorithm that I can use in XSLT 3 would be appreciated. 
Thanks in advance.
 
Rick
 
Rick Quatro
Carmen Publishing Inc.
rick(_at_)frameexpert(_dot_)com <mailto:rick(_at_)frameexpert(_dot_)com>
585-729-6746
www.frameexpert.com/store/ <http://www.frameexpert.com/store/>
XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/293509> (by 
email <>)
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--
<Prev in Thread] Current Thread [Next in Thread>