|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Key problem. Ordering XML with conditions than ge
Hi,
Gabriel Osorio wrote: About: "RE: Another <xsl:key> problem " I thought so, that is why I asked you to start a new thread... 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. You found a complex example.. :-) There are several references to tutorials on http://www.w3.org/Style/XSL/, among which http://www.dpawson.co.uk/xsl/xslfaq.html... Really I do not have opinion. I used your template and did not obtain results, because of it I sent the xml again. Many templates have been sent. You mean mine? The one that was generating a XSL in ax-xsl namespace? Your recursion solution is elegant, but I can't understand the siblings use. That can't have been mine. :-) Who are you referring to? Not very relevant actually. May be you can help me... It appears to me that your xml is already sorted to price, though empty pay and Credit pay grades/courses are not separated into a new group (grade?). If you would just like to sort the grades to price, you could do the following: <!-- promotions --> <xsl:apply-templates select="//grade[(var/pay = 'Credit') or (var/pay = '')]" /> <!-- others --> <xsl:apply-templates select="//grade[(var/pay != 'Credit') and (var/pay != '')]"> <xsl:sort select="var/price" data-type="number" /> </xsl:apply-templates> No need for keys in that case. Reordering the courses along to teachers is more difficult as it requires regrouping the information. This can be done like this: <xsl:key name="courses-by-teacher" match="course" use="teacher" /> <xsl:key name="teachers" match="teacher" use="." /> <xsl:for-each select="//teacher"> <!-- alphabetize them --> <xsl:sort /> <!-- teacher occur multiple times, take first occurrence -->
<xsl:if test="generate-id(.) = generate-id(key('teachers', .)[1])">
<group>
<xsl:copy-of select="." />
<xsl:copy-of select="key('courses-by-teacher', .)" />
</group>
</xsl:if>
</xsl:for-each><snip /> -------------------------------------------------- <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)" /> Try to use key names that explain what is matched and what is used as key. Besides, I think I would move the boolean to a predicate in the match pattern and define separate keys for the true and the false case. Why using a boolean where a string is expected? Looking more carefully at order1, I think you could have replaced it with a (global) variable just as well: <xsl:variable name="promotions" select="//grade[((substring(var/pay,1,1))='') or ((substring(var/pay,1,1))='C')]" /> Doesn't that make much more sense? <xsl:template match='root'> <table> I am pretty certain that the predicate in the select of this for-each is doing the same as the test in the if. They are both selecting the first in document order that matches the given key 'true', which refers to the promotion courses (or grades?) I guess. Here again. Ah, this makes sense. You are picking the courses that belong to a certain teacher, right? A good use case for a key. Though, how is this related to credit/non-credit courses? It is not obvious that you have limited your expression to the credit courses (or are it grades?) by the 'false'. This becomes much more obvious when using separate keys for credit and non-credit courses... <xsl:sort select="var/price" order="ascending" data-type="number"/> Try to keep your solution as plain and simple as possible. It should be obvious from naming and expressions what you are trying to achieve. HTH, Geert
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








