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)>value-of(./previous-sibling/@Cnt) and
value-of(@Cnt)<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)>value-of(./previous-sibling/@Cnt) and
value-of(@Cnt)<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