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

Re: My Difficult counting problem

Subject: Re: My Difficult counting problem
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Thu, 22 Aug 2002 18:14:58 -0400
counting logic is xsl
Tim,

This problem looks harder than it is. There are basically two things you need to solve it: (a) to restate the problem in a way more amenable to XSLT, and (b) apply a little fancy XPath (which you can learn by asking on this list :-).

You say "I don't know how loop through the nodes, and keep track of how many
occurrences there are up to the given position", which is basically about half right in the way of a solution. I say half since the XSL Way isn't to "loop through" anything, much less to keep track of anything while doing so. Yet the problem is easily solved if you just say "I want my output in the same order as my input [that's easy], and for each foo, I want my output to get a number reflecting how many foos of the same name came before it".


In XSLT this logic would be:

<xsl:template match="foo">
<xsl:value-of select="count(preceding-sibling::foo[@name=current()/@name]) + 1"/>
</xsl:template>


Spiffed it up to get more exactly what you want:

<xsl:template match="myElement">
  <xsl:text>numberOccurrences[] = {</xsl:text>
  <xsl:apply-templates/>
  <xsl:text>};</xsl:text>
</xsl:template>

<xsl:template match="foo">
<xsl:variable name="thisname" select="@name"/>
<!-- this time we're using a variable just to make the logic a little clearer -->
<xsl:if test="preceding-sibling::foo">
<!-- we want a comma unless we're the first foo -->
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:value-of select="count(preceding-sibling::foo[@name=$thisname]) + 1"/>
<!-- note we used the variable this time instead of current()/@name -->
</xsl:template>


You could do the same thing in a single xsl:template if you used an xsl:for-each inside it for the "loop" (which isn't a loop) -- but it would do the same thing.

Cheers,
Wendell


At 05:48 PM 8/22/2002, you wrote:
hello,

I need some help doing the following, I can't seem to figure out how to do
this in XSL

I need to convert something like this
<myElement>
   <foo name="foobar1"/>
   <foo name="foobar2"/>
   <foo name="foobar1"/>
   <foo name="foobar3"/>
   <foo name="foobar1"/>
   <foo name="foobar1"/>
   <foo name="foobar3"/>
</myElement>

and the output after running it through the XSL would be

numberOccurrences[] = {1, 1, 2, 1, 3, 4, 2};

basically for each foo with a duplicate name you put the occurrence number
of it in the array at the correct position.

You see that foobar1 occurs 4 times,
the 1st occurrence is at position 0, while 2nd occurrence is at position 2,
3rd at position 4, and 5th at position 5. etc.

I don't know how loop through the nodes, and keep track of how many
occurrences there are up to the given position.


======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================


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.