[xep-support] Need to evaluate string-lengths for a set of no des--how?

Blankner, Sherrod Sherrod.Blankner at schwab.com
Fri Aug 13 14:47:55 PDT 2004


Werner:
We sorted it out--turned out to be much more elaborate than we thought, but
your suggestion of following-sibling was key. I was thinking in terms of
preceding, but that wasn't going to work. We had to get very elaborate to
account for commas and the use of "and" between names, but other than that
it was okay. Had to do a line counter to keep track of how many lines we
were allowed to use.

Here's the code we developed, in case you're interested. Thanks!
Sherrod

	<xsl:template name="maxLineCounter">		<xsl:choose>			<xsl:when test="/package/recipient/address2=''">				<xsl:choose>					<xsl:when test="( normalize-space( country )
= 'US' and not ( starts-with( state, 'A#' ) ) )">						<xsl:value-of select="4"/>					</xsl:when>					<xsl:otherwise>						<xsl:value-of select="3"/>					</xsl:otherwise>				</xsl:choose>			</xsl:when>			<xsl:otherwise>				<xsl:choose>					<xsl:when test="( normalize-space( country )
= 'US' and not ( starts-with( state, 'A#' ) ) )">						<xsl:value-of select="3"/>					</xsl:when>					<xsl:otherwise>						<xsl:value-of select="2"/>					</xsl:otherwise>				</xsl:choose>			</xsl:otherwise>		</xsl:choose>	</xsl:template>		<!-- commaFinder -->		<xsl:template name="commaFinder">	<xsl:param name="oldCopy"/>	<xsl:param name="width"/>		<xsl:choose>			<xsl:when test="substring($oldCopy,$width,1) = ','">			<xsl:value-of select="$width"/>							</xsl:when>			<xsl:otherwise>				<xsl:call-template name="commaFinder">					<xsl:with-param select="$oldCopy"
name="oldCopy"/>						<xsl:with-param select="$width - 1"
name="width"/>				</xsl:call-template>			</xsl:otherwise>		</xsl:choose>	</xsl:template>		<!-- copyChopper -->		<xsl:template name="copyChopper">		<xsl:param name="startPosition"/>			<xsl:param name="maxLineCount"/>		<xsl:param name="lineCount"/>		<xsl:param name="oldCopy"/>			<xsl:param name="purpose"/>					<xsl:variable name="addressLineWidth">60</xsl:variable>				<xsl:choose>					<xsl:when
test="/package/recipient/names/name[position() = $startPosition + 1]">									<xsl:if
test="($lineCount &lt; $maxLineCount) and
/package/recipient/names/name[position() = $startPosition + 2]">		
<xsl:variable name="lessMax2Fol" select="normalize-space(concat($oldCopy,',
',/package/recipient/names/name[position() = $startPosition +
1]))"></xsl:variable>		
<xsl:choose>		
<xsl:when test="string-length($lessMax2Fol) &lt; $addressLineWidth">		
<xsl:call-template name="copyChopper">		
<xsl:with-param select="$startPosition + 1" name="startPosition"/>			
<xsl:with-param select="$maxLineCount" name="maxLineCount"/>		
<xsl:with-param select="$lineCount" name="lineCount"/>		
<xsl:with-param select="$lessMax2Fol" name="oldCopy"/>			
<xsl:with-param select="'getCopy'" name="purpose"/>			
</xsl:call-template>		
</xsl:when>		
<xsl:otherwise>		
<xsl:choose>		
<xsl:when test="$purpose = 'getStartPosition'">		
<xsl:value-of select="$startPosition + 1"/>		
</xsl:when>		
<xsl:otherwise>		
<xsl:value-of select="concat(normalize-space($oldCopy),',','&#xD;')"/>		
<xsl:call-template name="format">		
<xsl:with-param select="$maxLineCount" name="maxLineCount"/>		
<xsl:with-param select="$lineCount + 1" name="lineCount"/>		
<xsl:with-param select="$startPosition + 1" name="startPosition"/>		
</xsl:call-template>		
</xsl:otherwise>		
</xsl:choose>			
</xsl:otherwise>		
</xsl:choose>										</xsl:if>																		<xsl:if
test="($lineCount &lt; $maxLineCount) and
not(/package/recipient/names/name[position() = $startPosition + 2])">		
<xsl:variable name="lessMax1Fol" select="normalize-space(concat($oldCopy,'
and ',/package/recipient/names/name[position() = $startPosition +
1]))"></xsl:variable>		
<xsl:choose>		
<xsl:when test="string-length($lessMax1Fol) &lt; $addressLineWidth">		
<xsl:choose>		
<xsl:when test="$purpose = 'getStartPosition'">		
<xsl:value-of select="$startPosition + 1"/>		
</xsl:when>		
<xsl:otherwise>		
<xsl:value-of select="$lessMax1Fol"/>		
</xsl:otherwise>		
</xsl:choose>			
</xsl:when>		
<xsl:otherwise>		
<xsl:choose>		
<xsl:when test="$purpose = 'getStartPosition'">		
<xsl:value-of select="$startPosition + 1"/>		
</xsl:when>		
<xsl:otherwise>		
<xsl:value-of select="concat(normalize-space($oldCopy),',','&#xD;')"/>		
<xsl:call-template name="format">		
<xsl:with-param select="$maxLineCount" name="maxLineCount"/>		
<xsl:with-param select="$lineCount + 1" name="lineCount"/>		
<xsl:with-param select="$startPosition + 1" name="startPosition"/>		
</xsl:call-template>		
</xsl:otherwise>		
</xsl:choose>			
</xsl:otherwise>		
</xsl:choose>													</xsl:if>																		<xsl:if
test="($lineCount = $maxLineCount) and
/package/recipient/names/name[position() = $startPosition + 2]">		
<xsl:variable name="EqMax2Fol" select="normalize-space(concat($oldCopy,',
',/package/recipient/names/name[position() = $startPosition +
1]))"></xsl:variable>		
<xsl:choose>		
<xsl:when test="string-length($EqMax2Fol) &lt; $addressLineWidth">		
<xsl:call-template name="copyChopper">		
<xsl:with-param select="$startPosition + 1" name="startPosition"/>			
<xsl:with-param select="$maxLineCount" name="maxLineCount"/>		
<xsl:with-param select="$lineCount" name="lineCount"/>		
<xsl:with-param select="$EqMax2Fol" name="oldCopy"/>			
<xsl:with-param select="'getCopy'" name="purpose"/>			
</xsl:call-template>		
</xsl:when>		
<xsl:otherwise>		
<xsl:choose>		
<xsl:when test="$purpose = 'getStartPosition'">		
<xsl:value-of select="$startPosition + 1"/>		
</xsl:when>		
<xsl:otherwise>		
<xsl:choose>		
<xsl:when test="contains(normalize-space($oldCopy),',')">		
		
<xsl:variable name="commaLocation">		
<xsl:call-template name="commaFinder">		
<xsl:with-param select="$oldCopy" name="oldCopy"/>			
<xsl:with-param select="$addressLineWidth" name="width"/>		
</xsl:call-template>		
</xsl:variable>		
		
<xsl:variable name="oldCopyRedone"
select="normalize-space(concat(substring($oldCopy,1,$commaLocation - 1),'
and ',substring($oldCopy,$commaLocation + 1)))"/>		
		
<xsl:value-of select="normalize-space($oldCopyRedone)"/>		
</xsl:when>		
<xsl:otherwise>		
<xsl:value-of select="normalize-space(concat('and ',$oldCopy))"/>		
</xsl:otherwise>		
</xsl:choose>			
<xsl:call-template name="format">		
<xsl:with-param select="$maxLineCount" name="maxLineCount"/>		
<xsl:with-param select="$lineCount + 1" name="lineCount"/>		
<xsl:with-param select="$startPosition + 1" name="startPosition"/>		
</xsl:call-template>		
</xsl:otherwise>		
</xsl:choose>			
</xsl:otherwise>		
</xsl:choose>										</xsl:if>																		<xsl:if
test="($lineCount = $maxLineCount) and
not(/package/recipient/names/name[position() = $startPosition + 2])">												
<xsl:variable name="equalMax1Fol" select="normalize-space(concat($oldCopy,'
and ',/package/recipient/names/name[position() = $startPosition +
1]))"></xsl:variable>		
<xsl:choose>		
<xsl:when test="string-length($equalMax1Fol) &lt; $addressLineWidth">		
<xsl:choose>		
<xsl:when test="$purpose = 'getStartPosition'">		
<xsl:value-of select="$startPosition + 1"/>		
</xsl:when>		
<xsl:otherwise>		
<xsl:value-of select="$equalMax1Fol"/>		
</xsl:otherwise>		
</xsl:choose>			
</xsl:when>		
<xsl:otherwise>		
		
<xsl:choose>		
<xsl:when test="$purpose = 'getStartPosition'">		
<xsl:value-of select="$startPosition + 1"/>		
</xsl:when>		
<xsl:otherwise>		
<xsl:value-of select="concat('and ',normalize-space($oldCopy),'&#xD;')"/>		
<xsl:call-template name="format">		
<xsl:with-param select="$maxLineCount" name="maxLineCount"/>		
<xsl:with-param select="$lineCount + 1" name="lineCount"/>		
<xsl:with-param select="$startPosition + 1" name="startPosition"/>		
</xsl:call-template>		
</xsl:otherwise>		
</xsl:choose>			
</xsl:otherwise>		
</xsl:choose>										</xsl:if>					</xsl:when>					<xsl:otherwise>						<xsl:choose>							<xsl:when test="$purpose =
'getStartPosition'">								<xsl:value-of
select="$startPosition + 1"/>							</xsl:when>							<xsl:otherwise>								<xsl:value-of
select="normalize-space(concat('and
',/package/recipient/names/name[position() = $startPosition]))"/>							</xsl:otherwise>						</xsl:choose>
					</xsl:otherwise>				</xsl:choose>	</xsl:template>	<!-- FORMAT -->		<xsl:template name="format">		<xsl:param name="maxLineCount"/>		<xsl:param name="lineCount"/>		<xsl:param name="startPosition"/>		<xsl:if test="$lineCount &lt;= $maxLineCount">				<xsl:variable name="startPositionVariable">				<xsl:call-template name="copyChopper">						<xsl:with-param
select="$startPosition" name="startPosition"/>							<xsl:with-param
select="$maxLineCount" name="maxLineCount"/>						<xsl:with-param select="$lineCount"
name="lineCount"/>						<xsl:with-param select="''"
name="oldCopy"/>							<xsl:with-param
select="'getStartPosition'" name="purpose"/>					</xsl:call-template>			</xsl:variable>							<xsl:variable name="copyVariable">				<xsl:call-template name="copyChopper">						<xsl:with-param
select="$startPosition" name="startPosition"/>							<xsl:with-param
select="$maxLineCount" name="maxLineCount"/>						<xsl:with-param select="$lineCount"
name="lineCount"/>						<xsl:with-param
select="/package/recipient/names/name[position() = $startPosition]"
name="oldCopy"/>							<xsl:with-param select="'getCopy'"
name="purpose"/>					</xsl:call-template>			</xsl:variable>			<fo:block linefeed-treatment="preserve"
wrap-option="no-wrap">		<xsl:value-of select="$copyVariable"/>		</fo:block>		</xsl:if>	</xsl:template>	<xsl:template name="namesParser">										<xsl:variable name="maxLineCount">			<xsl:call-template name="maxLineCounter">			</xsl:call-template>		</xsl:variable>				<xsl:call-template name="format">				<xsl:with-param select="$maxLineCount"
name="maxLineCount"/>				<xsl:with-param select="1" name="lineCount"/>				<xsl:with-param select="1" name="startPosition"/>		</xsl:call-template>	</xsl:template>			


The original "namesParser" template is called by a small call-templates code
in side a table cell

<xsl:call-template name="namesParser"></xsl:call-template>



> ----------
> From: 	owner-xep-support at renderx.com on behalf of Blankner, Sherrod
> Reply To: 	xep-support at renderx.com
> Sent: 	Wednesday, August 11, 2004 9:29 AM
> To: 	'xep-support at renderx.com'
> Subject: 	RE: [xep-support] Need to evaluate string-lengths for a set
> of no des--how?
> 
> Werner:
> Thanks for your reply! I was messing around with preceding sibing, but
> following-sibling may do the trick. I'll let you know how it progresses.
> skb
> 
> > ----------
> > From: 	owner-xep-support at renderx.com on behalf of Werner Donné
> > Reply To: 	xep-support at renderx.com
> > Sent: 	Wednesday, August 11, 2004 1:26 AM
> > To: 	xep-support at renderx.com
> > Subject: 	Re: [xep-support] Need to evaluate string-lengths for a set
> > of nodes--how?
> > 
> > Sherrod,
> > 
> > You can do apply-templates on the first name element. In the template
> > matching this you do the normal work followed by an apply-templates
> > on the following-sibling::name[1]. You pass the current total string
> > to the next as a parameter.
> > 
> > ..
> >    <xsl:apply-templates select="names/name[1]"/>
> > ..
> > 
> > <xsl:template match="names/name">
> >    <xsl:param name="current"/>
> >    <xsl:choose>
> >      <xsl:when test="string-length(.) + string-length($current) > 61">
> >        print a line with $current
> >        <xsl:choose>
> >          <xsl:when test="not(following-sibling::name)">
> >            print last line with context node
> >          </xsl:when>
> >          <xsl:otherwise>
> >            <xsl:apply-templates select="following-sibling::name[1]">
> >              <xsl:with-param name="current" select="text()"/>
> >            </xsl:apply-templates>
> >          </xsl:otherwise>
> >        </xsl:choose>
> >      </xsl:when>
> >      <xsl:when test="not(following-sibling::name)">
> >        print last line with $current and context node
> >      </xsl:when>
> >      <xsl:otherwise>
> >        <xsl:apply-templates select="following-sibling::name[1]">
> >          <xsl:with-param name="current" select="concat($current,
> > text())"/>
> >        </xsl:apply-templates>
> >      </xsl:otherwise>
> >    </xsl:choose>
> > </xsl:template>
> > 
> > Regards,
> > 
> > Werner.
> > 
> > Blankner, Sherrod wrote:
> > > 	Can anyone out there help me brainstorm some logic for a letter
> > > recipient name:
> > > 
> > > 	We have a simple letter XSL that processes the following XML to fill
> > > in the recipient name
> > > 	<names>
> > > 		<name>John Doe</name>
> > > 		<name>Jane Doe</name>
> > > 		<name>Jim Doe</name>
> > > 		</names>
> > > 
> > > 	Currently our XSL is very straight forward
> > > 
> > > 			<fo:block>
> > > 				<xsl:for-each select="names/name">
> > > 					<fo:block>
> > > 						<xsl:value-of select="."/>
> > > 					</fo:block>
> > > 				</xsl:for-each>
> > > 				</fo:block>
> > > 
> > > 
> > > However, with the new window size in the envelope, we can't stack
> names
> > > indefinitely--we only have 6 lines for the total address, with a
> maximum
> > of
> > > three name lines if the address is in the US. I need logic that
> > evaluates
> > > whether the string length of a set of <name> tags is more than 61
> > > characters, at which point I want to cut off and print just those
> names
> > into
> > > line 1. Then I need to start where line 1 left off and evaluate the
> next
> > set
> > > of <name> tags and see if these add up to under 61 characters, at
> which
> > > point I can write in line 2, etc. I have three possible lines.
> > > 
> > > Does anyone have any suggestions?
> > > I've been working with the string-length function, but I can't seem to
> > get
> > > it to increment up inside a for-each loop. I also messed around with
> > some
> > > param/call-templates functions but got the same result. 
> > > 
> > > Thanks
> > > Sherrod
> > > 
> > > 
> > > 
> > > 
> > > 
> > > Sherrod Blankner
> > > CRS Digital Studio
> > > ---------------------------------------------------
> > > 120 Kearny, 11th Floor
> > > Desk: 415-636-5181
> > > Cell: 415-225-9159
> > > ---------------------------------------------------
> > > 
> > > -------------------
> > > (*) To unsubscribe, send a message with words 'unsubscribe
> xep-support'
> > > in the body of the message to majordomo at renderx.com from the address
> > > you are subscribed from.
> > > (*) By using the Service, you expressly agree to these Terms of
> Service
> > http://www.renderx.com/tos.html
> > > 
> > > 
> > 
> > -- 
> > Werner Donné  --  Re BVBA
> > Engelbeekstraat 8
> > B-3300 Tienen
> > tel: (+32) 486 425803	e-mail: werner.donne at re.be
> > 
> > -------------------
> > (*) To unsubscribe, send a message with words 'unsubscribe xep-support'
> > in the body of the message to majordomo at renderx.com from the address
> > you are subscribed from.
> > (*) By using the Service, you expressly agree to these Terms of Service
> > http://www.renderx.com/tos.html
> > 
> > 
> 
> -------------------
> (*) To unsubscribe, send a message with words 'unsubscribe xep-support'
> in the body of the message to majordomo at renderx.com from the address
> you are subscribed from.
> (*) By using the Service, you expressly agree to these Terms of Service
> http://www.renderx.com/tos.html
> 
> 
-------------------
(*) To unsubscribe, send a message with words 'unsubscribe xep-support'
in the body of the message to majordomo at renderx.com from the address
you are subscribed from.
(*) By using the Service, you expressly agree to these Terms of Service http://www.renderx.com/tos.html



More information about the Xep-support mailing list