This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Customised sorting


Thank you all for all help on this issue. I did not know that it was
possible to create node-sets from the style-sheet the way shown in this
example. 

Best regards
Mille Eriksson

"G. Ken Holman" wrote:
> 
> At 01/04/05 14:30 +0200, Mille Eriksson wrote:
> >Now, my problem is very similar to this example but with the addition
> >that I need to sort the groups in a specific order. In the example this
> >would correspond to order the groups for example by the size of captial
> >of each country. This ordering information needs to bes supplied with
> >the style-sheet and not with the XML-document.
> 
> You don't pose very easy questions, do you?  :{)}
> 
> >Are there any ideas of how this can be accomplished?
> 
> The complete stylesheet below works successfully on your data.  All I added
> was the population information and the single sort command.
> 
> Assuming the following population of capitals:
> 
> <pop:capitals>
>   <city name="Paris"  pop="4000"/>
>   <city name="Roma"   pop="3000"/>
>   <city name="Madrid" pop="1000"/>
>   <city name="Napoli" pop="2000"/>
> </pop:capitals>
> 
> The result of executing the stylesheet is as follows:
> 
> T:\ftemp>saxon mille.xml mille.xsl
> <?xml version="1.0" encoding="utf-8"?>
> <countries>
>     <country name="Espana">
>        <city>Madrid</city>
>        <city>Barcelona</city>
>     </country>
>     <country name="Italia">
>        <city>Milano</city>
>        <city>Firenze</city>
>        <city>Napoli</city>
>     </country>
>     <country name="Italy">
>        <city>Roma</city>
>     </country>
>     <country name="France">
>        <city>Paris</city>
>        <city>Nice</city>
>        <city>Lyon</city>
>     </country>
> </countries>
> T:\ftemp>
> 
> The sort value evaluation is as follows:
> 
>        <xsl:sort
>           select="document('')/*/pop:capitals
>                        /city[@name=current()/ancestor::cities/
>                                      city[@country=current()]/@name]
>                        /@pop"/>
> 
> ... which in English reads:
> 
> "for each node being sorted, pick from the stylesheet capital nodes that
> city whose name attribute value is the same value as the name attribute of
> one of the cities in the source document of all those cities whose country
> attribute value is the same as the node being sorted, then base the sort on
> that stylesheet node's population attribute"
> 
> The finding of the capital of the country relies on the comparison of node
> sets.
> 
> I don't think there are any other ways to fulfill what you've asked for,
> but I would be pleased to see if there is a more succinct solution from
> another member of the mail list.
> 
> I hope you find this helpful.
> 
> ...................... Ken
> 
> <?xml version="1.0"?><!--mille.xsl-->
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>                  xmlns:pop="population" exclude-result-prefixes="pop"
>                  version="1.0">
> 
> <pop:capitals>
>   <city name="Paris"  pop="4000"/>
>   <city name="Roma"   pop="3000"/>
>   <city name="Madrid" pop="1000"/>
>   <city name="Napoli" pop="2000"/>
> </pop:capitals>
> 
> <xsl:output indent="yes"/>
> 
> <xsl:template match="/">
>    <xsl:variable name="unique-countries"
>      select="/cities
>        /city[not(@country=preceding-sibling::city/@country)]
>        /@country"
>    />
>    <countries>
>      <xsl:for-each select="$unique-countries">
>        <xsl:sort
>           select="document('')/*/pop:capitals
>                        /city[@name=current()/ancestor::cities/
>                                      city[@country=current()]/@name]
>                        /@pop"/>
>        <country name="{.}">
>          <xsl:for-each select="//city[@country=current()]">
>            <city>
>              <xsl:value-of select="@name"/>
>            </city>
>          </xsl:for-each>
>        </country>
>      </xsl:for-each>
>    </countries>
> </xsl:template>
> 
> </xsl:stylesheet>
> 
> p.s. please ignore my ignorance of European capital cities if I've guessed
> incorrectly
> 
> --
> G. Ken Holman                      mailto:gkholman@CraneSoftwrights.com
> Crane Softwrights Ltd.               http://www.CraneSoftwrights.com/s/
> Box 266, Kars, Ontario CANADA K0A-2E0     +1(613)489-0999   (Fax:-0995)
> Web site:     XSL/XML/DSSSL/SGML/OmniMark services, training, products.
> Book:  Practical Transformation Using XSLT and XPath ISBN 1-894049-06-3
> Article: What is XSLT? http://www.xml.com/pub/2000/08/holman/index.html
> Next public instructor-led training:      2001-04-06,05-01,05-14,05-15,
> -                 05-16,05-17,05-21,05-22,06-18,06-21,07-20,07-21,09-19
> 
> !!Five-day XSLT/XPath/XSLFO Training Blitz June 18-22, 2001 in Ottawa!!
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list

-- 
Mille Eriksson
Technical Design
Observer AB
SE-114 88 Stockholm, Sweden
Phone: +46 (0)709 42 42 32

Internet: www.observergroup.com

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]