Subject: [xsl] Key problem. Ordering XML with conditions than generate new associations. From: "Gabriel Osorio" <gosorio@xxxxxxxxxxx> Date: Wed, 28 Sep 2005 11:08:35 -0500 |
About: "RE: [xsl] Another <xsl:key> problem " My intentions are educational. :-) I'm a beginner. Now my problem is to order nodes in groups based on certain characteristics of their children. (Using DIV tags.) And perhaps seeing to other way I can find my own solution. Really I do not have opinion. I used your template and did not obtain results, because of it I sent the xml again. Your recursion solution is elegant, but I can't understand the siblings use. May be you can help me... ____________________________________________________________ My own problem is: This is language's teacher board offer example. I need sort teacher's offers by price. And sort teachers from cheapest to most expensive. With this rule: "If the course can pay with credit card or is not informed, it's a promotion." The promotions are a new group. And carry out the teacher's rules. Other additional complication: courses have two or more teachers. And the sorted group uses the first teacher's name. -------------------------------------------------- My XML: -------------------------------------------------- <?xml version="1.0" ?> <root> <grade> <course> <class>1</class> <shift>0</shift> <teacher>Z</teacher> </course> <course> <class>2</class> <shift></shift> <teacher>na</teacher> </course> <var> <pay></pay> <price>200</price> </var> </grade> <grade> <course> <class>1</class> <shift>1</shift> <teacher>X</teacher> </course> <course> <class>2</class> <shift></shift> <teacher>X</teacher> </course> <var> <pay>All</pay> <price>170</price> </var> </grade> <grade> <course> <class>1</class> <shift>1</shift> <teacher>Y</teacher> </course> <course> <class>2</class> <shift></shift> <teacher>Y</teacher> </course> <var> <pay>Basic</pay> <price>150</price> </var> </grade> <grade> <course> <class>1</class> <shift>0</shift> <teacher>X</teacher> </course> <course> <class>2</class> <shift></shift> <teacher>X</teacher> </course> <var> <pay>Credit</pay> <price>100</price> </var> </grade> <grade> <course> <class>1</class> <shift>1</shift> <teacher>Z</teacher> </course> <course> <class>2</class> <shift></shift> <teacher>Z</teacher> </course> <var> <pay>All</pay> <price>100</price> </var> </grade> <grade> <course> <class>1</class> <shift>1</shift> <teacher>X</teacher> </course> <course> <class>2</class> <shift></shift> <teacher>na</teacher> </course> <var> <pay>All</pay> <price>70</price> </var> </grade> </root> -------------------------------------------------- My XSL is: -------------------------------------------------- <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:key name="order1" match="grade" use="((substring(var/pay,1,1))='') or ((substring(var/pay,1,1))='C')" /> <xsl:key name="order2" match="grade" use="concat(((substring(var/pay,1,1))='') or ((substring(var/pay,1,1))='C'),course[1]/teacher)" /> <xsl:template match='root'> <table> <!--Expecial logic for C pay nodes.--> <xsl:for-each select="grade[count(. | key('order1', 'true')[1]) = 1]"> <xsl:if test="generate-id()=generate-id(key('order1', 'true'))"> <tr><td><div><xsl:attribute name="id">credit_offer</xsl:attribute><table> <tr><td>Credit Offer</td></tr> <xsl:for-each select="key('order1', 'true')"> <xsl:sort select="var/price" order="ascending" data-type="number"/> <xsl:call-template name="course"/> </xsl:for-each> </table></div></td></tr> </xsl:if> </xsl:for-each> <!--Logic to group nodes with standar pays--> <xsl:for-each select="grade[count(. | key('order2', concat('false',course[1]/teacher))[1]) = 1]"> <xsl:if test="generate-id()=generate-id(key('order2', concat('false',course[1]/teacher)))"> <tr><td><div><xsl:attribute name="id"><xsl:value-of select="course[1]/teacher"/></xsl:attribute><table> <tr><td>Teacher's Leader: <xsl:value-of select="course[1]/teacher"/></td></tr> <xsl:for-each select="key('order2', concat('false',course[1]/teacher))"> <xsl:sort select="var/price" order="ascending" data-type="number"/> <xsl:call-template name="course"/> </xsl:for-each> </table></div></td></tr> </xsl:if> </xsl:for-each> </table> </xsl:template> <!--The rest.--> <xsl:template name="course"> <tr> <td><xsl:value-of select="position()"/>.</td> <td>Price: <xsl:value-of select="var/price"/>.</td> <td><xsl:apply-templates select='course'/></td> </tr> </xsl:template> <xsl:template match="course"> <br/>teacher: <xsl:value-of select="teacher"/>   class: <xsl:value-of select="class"/>   shift: <xsl:value-of select="shift"/>   Pay: <xsl:value-of select="../var/pay"/> </xsl:template> </xsl:stylesheet> Thanks in advance. Gabriel
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Another <xsl:key> problem, Ragulf Pickaxe | Thread | Re: [xsl] Key problem. Ordering XML, Geert Josten |
Re: [xsl] Specifying the XHTML XMLN, knocte | Date | RE: [xsl] Specifying the XHTML XMLN, Michael Kay |
Month |