|
Subject: Re: [xsl] For-each loop or recursion From: "Aron Bock" <aronbock@xxxxxxxxxxx> Date: Mon, 16 May 2005 18:17:46 +0000 |
Existing code is very complex - big Cocoon project
(and I started using XSLT 2 weeks ago, but have lots of experience in Java/C/C++), so I tried to keep concentrated on what I am doing:
At this point I am interested in how to implement algorithms in XSLT: a) find out first non-zero on either rebate1 and rebate2 b) find out first occurrence of max number in either rebate1 or rebate2
So back to my questions: 1) How do I get a position of last occurrence of min ?
Many ways, 2 of which may be: --locate the node and count its preceding siblings --count number of min and adjust
1a) Can I scan using for-each loop from the end of the sequence to the beginning ?
2) OK, lets try to get a position of the first occurrence when var2 = max node.
What would be a correct ?
<xsl:for-each select=mystruct/myarray1[1]/myvar> <xsl:if select="rebate1=*[last()]"> <xsl:value-of select="position()"> </xsl:if> </xsl:for-each>
3) Expanding 2 for the rebate2 (var3) for the values from another (parallel) branch, would that work ?
<xsl:for-each select=mystruct/myarray1[1]/myvar> <xsl:if select="rebate1=*[last()] and ../../../myarray2[1]/myvar/rebate2=*[last()]"> <xsl:value-of select="position()"> </xsl:if> </xsl:for-each>
I think, that second *[last()] is wrong, I have to get a max of the rebate2 (second sequence) before that for-each loop.
3a) Can I calculate max of rebate2 like: <xsl:variable name="max2" select="mystruct/myarray2[1]/myvar/rebate2[position()=last()]"> Is that the right way of assigning *[last()] to a variable ?
column to be displayed [first non-zero on either rebate1 and rebate2]
and the last one [first occurrence of max number in either rebate1 or rebate2]
1 2 3 4 5 6 7 8 9 10 11 12 13 (sales volume) rebate1(%) 0 0 1 2 3 4 5 6 7 8 8 8 8 rebate2(%) 0 1 2 3 4 5 6 7 9 10 11 11 11
Need it be dynamically trimmed to display:
2 3 4 5 6 7 8 9 10 "11 or more" rebate1(%) 0 1 2 3 4 5 6 7 8 8 rebate2(%) 1 2 3 4 5 6 7 9 10 11
So if it makes it any easier, we can call it mystruct/myarray1[1]/myvar/rebate1 and mystruct/myarray2[1]/myvar/rebate2
<mystruct>
<myarray1>
<myvar><rebate1>0</rebate1></myvar>
<myvar><rebate1>0</rebate1></myvar>
<myvar><rebate1>1</rebate1></myvar>
<myvar><rebate1>2</rebate1></myvar>
<myvar><rebate1>3</rebate1></myvar>
<myvar><rebate1>4</rebate1></myvar>
<myvar><rebate1>5</rebate1></myvar>
<myvar><rebate1>6</rebate1></myvar>
<myvar><rebate1>7</rebate1></myvar>
<myvar><rebate1>8</rebate1></myvar>
<myvar><rebate1>8</rebate1></myvar>
<myvar><rebate1>8</rebate1></myvar>
</myarray1>
<myarray2>
<myvar><rebate2>0</rebate2></myvar>
<myvar><rebate2>1</rebate2></myvar>
<myvar><rebate2>2</rebate2></myvar>
<myvar><rebate2>3</rebate2></myvar>
<myvar><rebate2>4</rebate2></myvar>
<myvar><rebate2>5</rebate2></myvar>
<myvar><rebate2>6</rebate2></myvar>
<myvar><rebate2>7</rebate2></myvar>
<myvar><rebate2>9</rebate2></myvar>
<myvar><rebate2>10</rebate2></myvar>
<myvar><rebate2>11</rebate2></myvar>
<myvar><rebate2>11</rebate2></myvar>
<myvar><rebate2>11</rebate2></myvar>
</myarray2>
</mystruct> <xsl:template match="/">
<xsl:call-template name="raw-data"/>
<xsl:text>
</xsl:text>
<xsl:call-template name="trimmed-data"/>
</xsl:template> <xsl:template name="raw-data">
<xsl:text>raw data (sorted)
</xsl:text>
<xsl:text>rebate1 </xsl:text>
<xsl:apply-templates select="mystruct/myarray1/myvar/rebate1">
<xsl:sort data-type="number" select="."/>
</xsl:apply-templates>
<xsl:text>
</xsl:text> <xsl:text>rebate2 </xsl:text>
<xsl:apply-templates select="mystruct/myarray2/myvar/rebate2">
<xsl:sort data-type="number" select="."/>
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</xsl:template> <!-- pos of first non-zero rebate* -->
<xsl:variable name="pr">
<xsl:choose>
<xsl:when test="$pr1 <= $pr2">
<xsl:value-of select="$pr1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$pr2"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable> <!-- max rebate1 -->
<xsl:variable name="mr1">
<xsl:for-each select="mystruct/myarray1/myvar/rebate1">
<xsl:sort data-type="number" select="."/>
<xsl:if test="position() = last()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:variable> <!-- max rebate2 -->
<xsl:variable name="mr2">
<xsl:for-each select="mystruct/myarray2/myvar/rebate2">
<xsl:sort data-type="number" select="."/>
<xsl:if test="position() = last()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:variable> <!-- pos of greater max rebate* -->
<xsl:variable name="pmr">
<xsl:choose>
<xsl:when test="$pmr1 >= $pmr2">
<xsl:value-of select="$pmr1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$pmr2"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable> <xsl:text>trimmed data
</xsl:text>
<xsl:text>rebate1 </xsl:text>
<xsl:for-each select="mystruct/myarray1/myvar/rebate1">
<xsl:if test="position() >= $pr and position() <= $pmr">
<xsl:apply-templates select="."/>
</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text> <xsl:text>rebate2 </xsl:text>
<xsl:for-each select="mystruct/myarray2/myvar/rebate2">
<xsl:if test="position() >= $pr and position() <= $pmr">
<xsl:apply-templates select="."/>
</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:template> <xsl:template match="rebate1">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template> <xsl:template match="rebate2">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>raw data (sorted) rebate1 0 0 1 2 3 4 5 6 7 8 8 8 rebate2 0 1 2 3 4 5 6 7 9 10 11 11 11
trimmed data rebate1 0 1 2 3 4 5 6 7 8 8 rebate2 1 2 3 4 5 6 7 9 10 11
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] For-each loop or recursio, Oleg Konovalov | Thread | Re: [xsl] For-each loop or recursio, Oleg Konovalov |
| Re: [xsl] XSLT 2.0 Is Way Cool, Eliot Kimber | Date | RE: [xsl] making a number from a de, Wendell Piez |
| Month |