xsl-list
[Top] [All Lists]

Re: local extremums

2003-03-19 01:39:00
Hi Evgenia,

Hello!

I have a problem with determining local extremums (precisely - local
maximums) of the list.

I mean I need to realize next algorithm:
1. take the list (it is //PoketTourList/Country/Range on first iteration)
2. determine the maximum @Cnt of this list
3. cast away this maximum and two his nearest neighbours
4. if line isn't empty than goto step 1
So I need a list with any flag showing Range is local extremum or not.
Or I need a way to go throw whole list and determine if each Range is local
extremum or not on every step.

The list structure is:
<PoketTourList numChild="21">
        <Country ID="12">
                <Range PriceFrom="0" PriceTo="100" Cnt="0"/>
                <Range PriceFrom="100" PriceTo="150" Cnt="0"/>
                <Range PriceFrom="150" PriceTo="200" Cnt="71"/>
                <Range PriceFrom="200" PriceTo="250" Cnt="376"/>
                <Range PriceFrom="250" PriceTo="300" Cnt="751"/>
                <Range PriceFrom="300" PriceTo="350" Cnt="684"/>
                <Range PriceFrom="350" PriceTo="400" Cnt="585"/>
                <Range PriceFrom="400" PriceTo="500" Cnt="1135"/>
                <Range PriceFrom="500" PriceTo="600" Cnt="787"/>
                <Range PriceFrom="600" PriceTo="700" Cnt="586"/>
                <Range PriceFrom="700" PriceTo="800" Cnt="461"/>
                <Range PriceFrom="800" PriceTo="1000" Cnt="485"/>
                <Range PriceFrom="1000" PriceTo="1200" Cnt="173"/>
                <Range PriceFrom="1200" PriceTo="1400" Cnt="86"/>
                <Range PriceFrom="1400" PriceTo="10000" Cnt="91"/>
        </Country>
        ...
</PoketTourList>

Please, please, help me!

I'll try...

I don't think your English is bad, but your question is probably poorly stated. That said, I don't think any of the solutions proposed are the best for this problem. I am not very good at XSLT, so there might be syntactic errors but I hope it will send you in the right direction.

I would do something like:

<xsl:template match="/">
 <xsl:apply-templates select="PoketTourList/Country"/>
</xsl:template>

<xsl:template match="PoketTourList/Country">
 <xsl:apply-templates select="Range"/>
</xsl:template>

<xsl:template match="Range[value-of(@Cnt)&gt;value-of(./previous-sibling/@Cnt) and value-of(@Cnt)&lt;value-of(./next-sibling/@Cnt)]">

 <!-- Here do what you want with the extrema's -->
<!-- Should match Range elements with @Cnt = 751,1135,485 but probably not @Cnt=91, see later -->
</xsl:template>

<xsl:template match="Range[not(value-of(@Cnt)&gt;value-of(./previous-sibling/@Cnt) and value-of(@Cnt)&lt;value-of(./next-sibling/@Cnt))]">

 <!-- These are all the elements that are not extremas -->
<!-- Should match all other Range elements, probably including @Cnt=91 (last element). If you don't want the last, you should do something about this too -->
</xsl:template>

-------

The idea is to match the Range with an @Cnt value greater than the previous Range @Cnt and less than the next Range @Cnt value. In the other template I match those that do not satisfisfy both these conditions.

The syntax is most assuredly not correct and I have no idea what happens at the end points. You should probably make a third template that looks for position()=1 and only it's next sibling or position()=last() and only it's previous sibling.

Hope this helps and is more like what you want. At least here you have split up your elements in those whose @Cnt are local maxima and those whose are not.

Regards,
Ragulf Pickaxe :)

_________________________________________________________________
MSN 8 helps eliminate e-mail viruses. Get 2 months FREE*. http://join.msn.com/?page=features/virus


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