[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] Conditional splitting of string with XSL


Subject: RE: [xsl] Conditional splitting of string with XSL
From: Cams Ismael <Ismael.Cams@xxxxxxxxxxxxxxx>
Date: Mon, 27 Jan 2003 07:52:26 +0100

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: [xsl] 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
Keywords