RE: [xsl] increment value - philosophy

Subject: RE: [xsl] increment value - philosophy
From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
Date: Thu, 22 Jan 2004 15:06:35 -0500
At 2004-01-22 14:17 -0500, Govil, Anoop (Contractor) wrote:
Thanks for your note. That put things into the right perspective.

I don't think it did at all.


Yes, you are true that we are trying to get too much out of XSL.

FALSE!!! You are NOT trying to get too much out of XSLT ... you are looking at XSLT incorrectly. XSLT is *amazingly* powerful with hierarchies. When you are trying to use a hammer to affix a screw you are going to have problems and while the eventual solution may work it is the *wrong* way to do things!


My problem is due to two nested loops and the position() value is different in these two loops.

Your problem is trying to use position() ... I said there are many inherent facilities in XSLT for working with hierarchies.


I have started looking into recursive template implementation to find a
solution to my problem there.

Because you are a programmer and you are trying to solve a simple problem with ugly and difficult-to-maintain code.


If you have any sample for that, it will definitely be helpful to start with.

I would NOT try to solve the problem using recursion.


Below is your problem as you stated it, and two very simple one-line solutions using XSLT that don't use position(). Both techniques work regardless of how the node is being processed (the position() function *depends* on how the node is being processed). I hope one of them suits your needs. And I hope you see you don't have to use recursion for this particular requirement.

Handing you a solution doesn't help teach you about the language ... I hope you can see that I've tried to help you understand why your approaches were totally wrong and wasting a tremendous amount of time by trying to solve a hierarchical problem with a programmer's classical approach.

I sincerely hope this helps this time around.

.................... Ken

p.s. can I interest you or your colleagues in our publicly-subscribed hands-on training near DC in March? :{)}

At 2004-01-22 09:33 -0500, Govil, Anoop (Contractor) wrote:
I have the following XML and want to implement such that I can have a linear
counter increment with each iteration of the parent for-each loop and also
the nested for-each loop.
<?xml version="1.0"?>
<MENU>
    <MenuItems>
        <MenuLabel>Menu 1</MenuLabel>
        <SubMenuItems>
            <SubMenuLabel>Sub Menu 1</SubMenuLabel>
        </SubMenuItems>
        <SubMenuItems>
            <SubMenuLabel>Sub Menu 11</SubMenuLabel>
        </SubMenuItems>
    </MenuItems>
    <MenuItems>
        <MenuLabel>Menu 2</MenuLabel>
        <SubMenuItems>
            <SubMenuLabel>Sub Menu 2</SubMenuLabel>
        </SubMenuItems>
    </MenuItems>
</MENU>
e.g. The counter should return as:
1 for Menu 1
2 for SubMenu 1
3 for SubMenu 11
4 for Menu 2
5 for SubMenu 2



T:\ftemp>type anoop.xml <?xml version="1.0"?> <MENU> <MenuItems> <MenuLabel>Menu 1</MenuLabel> <SubMenuItems> <SubMenuLabel>Sub Menu 1</SubMenuLabel> </SubMenuItems> <SubMenuItems> <SubMenuLabel>Sub Menu 11</SubMenuLabel> </SubMenuItems> </MenuItems> <MenuItems> <MenuLabel>Menu 2</MenuLabel> <SubMenuItems> <SubMenuLabel>Sub Menu 2</SubMenuLabel> </SubMenuItems> </MenuItems> </MENU>

T:\ftemp>type anoop.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                version="1.0">

<xsl:output method="text"/>

<xsl:template match="/">
  <xsl:text>Method 1: using the count function:
</xsl:text>
  <xsl:for-each select="//MenuLabel | //SubMenuLabel">
    <xsl:value-of select="1 + count(preceding::MenuLabel) +
                          count(preceding::SubMenuLabel)"/>
    <xsl:value-of select="concat(' ',.)"/><xsl:text>
</xsl:text>
  </xsl:for-each>
  <xsl:text>Method 2: using xsl:number:
</xsl:text>
  <xsl:for-each select="//MenuLabel | //SubMenuLabel">
    <xsl:number level="any" count="MenuLabel | SubMenuLabel"/>
    <xsl:value-of select="concat(' ',.)"/><xsl:text>
</xsl:text>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
T:\ftemp>saxon anoop.xml anoop.xsl
Method 1: using the count function:
1 Menu 1
2 Sub Menu 1
3 Sub Menu 11
4 Menu 2
5 Sub Menu 2
Method 2: using xsl:number:
1 Menu 1
2 Sub Menu 1
3 Sub Menu 11
4 Menu 2
5 Sub Menu 2

T:\ftemp>


-- Public courses: sign up for one or both soon to reserve your seat! Each week: Monday-Wednesday: XSLT/XPath; Thursday-Friday: XSL-FO Washington, DC: 2004-03-15 San Francisco, CA: 2004-03-22 Hong Kong, China: 2004-05-17 Bremen, Germany: 2004-05-24 World-wide on-site corporate, government & user group XML training

G. Ken Holman                 mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0    +1(613)489-0999 (F:-0995)
Male Breast Cancer Awareness  http://www.CraneSoftwrights.com/s/bc


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



Current Thread