Subject: Re: [xsl] Line break algorithm From: "Michael Müller-Hillebrand mmh@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Sun, 3 May 2020 13:04:05 -0000 |
Hi Rick, I pulled this function using regular expressions (assuming there are no inline elements present) from some past project (no XSLT 3, sorry): <!-- try to break a string at the latest space character before the defined width returns a sequence of strings --> <xsl:function name="dy:wrapTextToLines" as="xs:string+"> <xsl:param name="text" as="xs:string" /> <xsl:param name="width" as="xs:integer" /> <xsl:choose> <xsl:when test="normalize-space($text) = ''"> <!-- return empty string --> <xsl:value-of select="''"/> </xsl:when> <xsl:otherwise> <xsl:variable name="cleaned" select="mormalize-space($text)"/> <xsl:variable name="wrapped" select=" replace(concat($cleaned,' '), concat('(.{0,', $width, '}) '), concat('$1', $gLF))"/> <xsl:sequence select="tokenize(replace($wrapped, concat($gLF, '$'), ''), $gLF)"/> </xsl:otherwise> </xsl:choose> </xsl:function> It works by adding a space to the end and then using a regular expression to select up to the max characters followed by a space. Since regexes are greedy by default, it will try to capture as many words as possible within the given limit. In my situation $gLF was a linefeed character, and in the last line I removed the closing LF before tokenizing the result. HTH, - Michael PS: Always nice remembering our FrameMaker timesb& > Am 03.05.2020 um 02:45 schrieb Rick Quatro rick@xxxxxxxxxxxxxx <mailto:rick@xxxxxxxxxxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx <mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>>: > > 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
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Line break algorithm, Liam R. E. Quin liam | Thread | Re: [xsl] Line break algorithm, Eliot Kimber ekimber |
Re: [xsl] Joining list fragments (w, Michael Kay mike@xxx | Date | Re: [xsl] Joining list fragments, Imsieke, Gerrit, le- |
Month |