[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: Conditional splitting of string with XSL

Subject: RE: Conditional splitting of string with XSL
From: Cams Ismael <Ismael.Cams@xxxxxxxxxxxxxxx>
Date: Mon, 27 Jan 2003 07:52:26 +0100
xsl wordwrap
I once needed that kind of stylesheet myself (not exactly the same of
course, but the same principe).
I can not guarantee it's 100% safe, but it's written in XSLT without any
extension functions (so it
should work with all xslt processors) and it did work for me. Of course it's
possible you need to make
some adaptions in it. For getting only three lines you should make something
up yourself.

<!-- This template returns a string that is splitted according
	 to a maximal length of characters.
	 Input parameters: 
	 	original (mandatory): original string that must be splitted
	 	maxLength (mandatory): maximum length before a split
	 	separator (mandatory): separator that must be used to split
the string
	 	wordWrap (optional): set this value to 'true' if a word must
keep together
	 			  			 instead of
splitting a word in the middle, there will
	 			  			 be split before the
word. Note that when the word is
	 			  			 longer than the
maximal length, it's impossible to
	 			  			 keep the word
together.
-->
<xsl:template name="string_splitter">
	<xsl:param name="original"/>
	<xsl:param name="maxLength"/>
	<xsl:param name="separator"/>
	<xsl:param name="wordWrap"/>
	<xsl:choose>
		<xsl:when test="string-length($original)>$maxLength">
			<xsl:variable name="length-substring">
				<xsl:choose>
					<xsl:when test="$wordWrap='true'">
						<xsl:call-template
name="lastCharPosition">
							<xsl:with-param
name="original" select="substring($original,1,$maxLength)"/>
							<xsl:with-param
name="character" select="' '"/>
						</xsl:call-template>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of
select="$maxLength"/>
					</xsl:otherwise>
				</xsl:choose>
			</xsl:variable>
			<xsl:value-of
select="concat(substring($original,1,$length-substring),$separator)"/>
			<xsl:call-template name="string_splitter">
				<xsl:with-param name="original"
select="substring($original,$length-substring+1,string-length($original))"/>
				<xsl:with-param name="maxLength"
select="$maxLength"/>
				<xsl:with-param name="separator"
select="$separator"/>
				<xsl:with-param name="wordWrap"
select="'true'"/>
			</xsl:call-template>
		</xsl:when>
		<xsl:otherwise>
			<xsl:value-of select="$original"/>
		</xsl:otherwise>
	</xsl:choose>
</xsl:template>

<!-- This template returns the position of the last
	 given character in the string that can be found. When
	 the character is not available in the string, the 
	 position of the last character is returned.
	 Input parameters:
		original (mandatory): original string in which the character
must be searched
		character(mandatory): character for which the last position
must be returned	 	 
-->
<xsl:template name="lastCharPosition">
	<xsl:param name="original"/>
	<xsl:param name="character"/>
	<xsl:param name="string_length"/>
	<xsl:variable name="len">
		<xsl:choose>
			<xsl:when test="$string_length">
				<xsl:value-of select="$string_length"/>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="'0'"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:variable>
	<xsl:variable name="char_len">
		<xsl:value-of select="string-length($character)"/>
	</xsl:variable>
	<xsl:choose>
		<xsl:when test="contains($original,$character)">
			<xsl:choose>
				<xsl:when
test="contains(substring-after($original,$character),$character)">
					<xsl:call-template
name="lastCharPosition">
						<xsl:with-param
name="original" select="substring-after($original,$character)"/>
						<xsl:with-param
name="character" select="$character"/>
						<xsl:with-param
name="string_length"
select="string-length(concat(substring-before($original,$character),'
'))+$len"/>
					</xsl:call-template>
				</xsl:when>
				<xsl:otherwise>
					<xsl:value-of
select="string-length(substring-before($original,$character))+$char_len+$len
"/>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:when>
		<xsl:otherwise>
			<xsl:value-of select="string-length($original)"/>
		</xsl:otherwise>
	</xsl:choose>
</xsl:template>

Hope it helps.

Kind regards,
Ismaël



-----Original Message-----
From: Mukul [mailto:mukulw3@xxxxxxxxx]
Sent: zondag 26 januari 2003 11:36
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject:  Conditional splitting of string with XSL


Hello ,
  I have a simple XML file as below:

<verylongtext>
longtextlongtextlongtext ongtextlongtextlongtextlon
textlongtextlongtextlongtex longtextlongtextlongte
tlongtextlongtextlongtextlongtext ongtextlongtext
ongtextlongte tlongtextlongtextlongtextlongtextlon
textlongtext ongtextlo gtextlongtext..can be very
long..
</verylongtext>

I want to write a XSL stylesheet which can split the
<verylongtext> data into multiple lines of 20
charcaters each. I need only 1st 3 lines after
splitting. 

If there is a space character in data, then the split
needs to be done just before the space, and the space
character should be the <= 20th character..

Can anybody please help me with this problem.. Or is
this at all possible with XSL..? Will appreciate an
early reply..

Regards,
Mukul



__________________________________________________
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
http://mailplus.yahoo.com

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.