[xsl] Split string into multiple sentences on word boundaries

Subject: [xsl] Split string into multiple sentences on word boundaries
From: "Bordeman, Chris" <Chris.Bordeman@xxxxxxxxxxxxxxxxx>
Date: Thu, 9 Apr 2009 14:04:43 -0500
Hi all.  I have a long string, need to break it up onto say 3 lines (may
vary), with a maximum of 10 characters on the first line, 50 on the
second, and 20 on the last line (all of which varies).

I can't just split at any character, I need to split between words.

Is there is a function already written somewhere that does something
like this?

Using Xslt 2.0 / Saxon.

Many thanks!

Chris Bordeman

-----Original Message-----
From: mark bordelon [mailto:markcbordelon@xxxxxxxxx]
Sent: Thursday, April 09, 2009 1:22 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: [xsl] XSL performance question: running count of attributes
using axes and sum()


Dear Gents,

Getting quite comfortable using XSL. Since I am using alot more
heavy-duty XSL, I am now hitting barriers with performance. My quesiton
to the forum is for once, not a beginner's question!

In transforming the <syl> tags below into HTML table cells to display
them, I need to format each cell with a green color with the running
total of the @length attributes is a multiple of four. Ideally having
the ability to do running totals in another variable would be great, but
not the best XSL-esque solution, so I am using axes instead. I have
tried solutions with count and sum, but performance is slow: 756 lines
like the ones below mean thousands of syllables to check, each with its
own axis computation -- the complete xform takes more than an hour!

Can anyone point me to a solution that is more performant yet still
elegant/simple?

An aside: it seems that ceiling() is an Xpath1.0 function, but oddly
enough not floor() -- Altova SPY complains about floor until I change
the stylesheet to version 2.0 (sigh). I would love this to transform in
XSL1.0 if possible, and rounding down each length to the integer is
essential to acheive the correct formatting result.

Thanks in advance for any help on this.

XML:

<poem>
	<line id="1">
		<word id="1">
			<syl length="2">Ar</syl>
			<syl length="1">ma</syl>
		</word>
		<word id="2">
			<syl length="1">vi</syl>
			<syl length="2">rum</syl>
		</word>
		<syl length="1">que</syl>
		<word id="3">
			<syl length="1">ca</syl>
			<syl length="2">no</syl>
		</word> ,
		<word id="4">
			<syl length="2">Tro</syl>
			<syl length="2">iae</syl>
		</word>
		<word id="5">
			<syl length="2">qui</syl>
		</word>
		<word id="6">
			<syl length="2">pri</syl>
			<syl length="1">mus</syl>
		</word>
		<word id="7">
			<syl length="1">ab</syl>
		</word>
		<word id="8">
			<syl length="2">o</syl>
			<syl length="2">ris</syl>
		</word>
	</line>
	<line id="2">
		<word>
			<syl length="2">li</syl>
			<syl length="1.5">to</syl>
			<syl length="1">ra</syl>
		</word> ,
		<word id="15">
			<syl length="2">mul</syl>
			<syl elide="true" length="1">tum</syl>
		</word>
		<word id="16">
			<syl length="2">il</syl>
			<syl elide="true" length="1">le</syl>
		</word>
		<word id="17">
			<syl length="2">et</syl>
		</word>
		<word id="18">
			<syl length="2">ter</syl>
			<syl length="2">ris</syl>
		</word>
		<word id="19">
			<syl length="2">iac</syl>
			<syl length="2">ta</syl>
			<syl length="1">tus</syl>
		</word>
		<word id="20">
			<syl length="1">et</syl>
		</word>
		<word id="21">
			<syl length="2">al</syl>
			<syl length="2">to</syl>
		</word>
	</line>
</poem>


XSL template:

<xsl:template match="syl">

<xsl:variable name="line_id"><xsl:value-of
select="node()/ancestor::line/@id" /></xsl:variable>

<xsl:variable name="current_quantity"><xsl:value-of
select="sum(preceding::syl[ancestor::line/@id = $line_id and
(not(@elide) or @elide='false') ]/floor(@length))" /></xsl:variable>

<xsl:variable name="color"><xsl:choose><xsl:when test="@length=2 and
($current_quantity mod 4 =
0)">background-color:#EEFFEE;</xsl:when></xsl:choose></xsl:variable>

<td style="{$color}"><xsl:value-of select="text()" /></td>

</xsl:template>

Current Thread