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]
Other format: [Raw text]

Re: Re: RE: sequence numbering.


Hi ,
Thanks very much to Jeni for sorting my probs out..
That was really very helpful.
How ever there is one more problem that popped out.
Here it goes..
The xml file..
<products>
    <product id = "1">
    <name>product1</name>
     <weight>56</weight>
     <color>11</color>
    </product>
    <product id = "2">
     <name>product2</name>
     <weight>56</weight>
     <color>11</color>
    </product>
    <product id = "3">
    <name>product3</name>
     <weight>56</weight>
     <color>11</color>
    </product>
    <product id = "4">
    <name>product4</name>
     <weight>56</weight>
     <color>12</color>
    </product>
    <product id = "5">
     <name>product5</name>
     <weight>56</weight>
     <color>12</color>
    </product>
    <colorlist>
    <color id = "11">
     <name>red</name>
    </color>
    <color id = "12">
    <name>blue</name>
    </color>
    </colorlist>
  </products>
Here i was adviced by Jenni to  sort the colors and store it in 
Variable.. and then use the <xalan:nodeset > for processing.
in doing so when i try to use the <xsl:key>, it does not seem to 
give me the desired result.
i am pasting below the xsl..
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; xmlns:xalan = 
"http://xml.apache.org/xalan"; exclude-result-prefixes="xalan">
<xsl:output omit-xml-declaration="yes" method="text"/>
<xsl:key  name = "color" match = "//colorlist/color" use = 
"@id"/>
<xsl:template match="/">
<xsl:variable name="sorted-color">
<xsl:for-each select="//product">
<xsl:sort select="./color" data-type="text" order="descending"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:for-each select="xalan:nodeset($sorted-color)/product">
<xsl:variable name="this_color" select="./color"/>
<xsl:number count="product[color=$this_color]"/><xsl:value-of 
select="this_color"/>
<xsl:value-of select="key('color',this_color)"/>
<xsl:text>&#xa;</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

I was expecting a result that would look like
1 blue
2 blue
1 red
2 red
3 red
but the key function is not returning any text..
and the result is
1
2
1
2
3
Am i wrong in my XSL or is there any thing i am missing out and 
which i am unaware of??
thanks
william
>Hi William,
>
> > about the name space,
> > The Declartion i am using is
> >
> > <xsl:stylesheet 
>xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> > xmlns:xalan="http://xml.apache.org/xslt";
> > xmlns:redirect="org.apache.xalan.xslt.extensions.Redirect"
> > extension-element-prefixes="redirect"
> >              version="1.0">
> >
> > and i am using XALAN processor
>
>OK, then you should be able to use xalan:nodeset() extension 
>function
>(see http://xml.apache.org/xalan-j/extensionslib.html#nodeset).
>
>[It seems likely that the next version of Xalan will support 
>EXSLT
>functions. See the recent mail from Don Leslie
>(http://aspn.activestate.com/ASPN/Mail/Message/exslt/1083089). 
>With
>that version, you'll be able to use the namespace
>http://exslt.org/common, and the function exsl:node-set(), which 
>would
>make your stylesheet portable across a range of processors, 
>including
>Saxon, libxslt, 4XSLT and jd.xslt.]
>
>Cheers,
>
>Jeni
>
>---
>Jeni Tennison
>http://www.jenitennison.com/
>
>
>  XSL-List info and archive:  
>http://www.mulberrytech.com/xsl/xsl-list
>


On Wed, 27 Mar 2002 william locksman wrote :
>Hi the solution Michael Suggested seems to fit my purpose, But 
>Since i am a newbie to XSL , I do not know how to form a 
>temporary tree that contains sorted sequence.
>Michael's explaination made me pretty much clear of what has to 
>be done. But i do not know how it has to be done.
>If any one can please suggest me how to go about doing it or give 
>me a link to any reference document, It should be of much help to 
>me
>Thanks
>William
>
>On Tue, 26 Mar 2002 Michael Kay wrote :
>><xsl:number> gives you the position of the element in the source 
>>tree, not
>>in the sorted sequence. To get the number in the sorted 
>>sequence, do a
>>two-phase transformation: create a temporary tree that contains 
>>the sorted
>>products, then process this (using xx:node-set()) to add the 
>>numbers. To get
>>the number for a product among all the products of the same 
>>colour, use
>><xsl:number count="product[color=$this_color]"/>
>>
>>Michael Kay
>>Software AG
>>home: Michael.H.Kay@ntlworld.com
>>work: Michael.Kay@softwareag.com
>>
>> > -----Original Message-----
>> > From: owner-xsl-list@lists.mulberrytech.com
>> > [mailto:owner-xsl-list@lists.mulberrytech.com]On Behalf Of 
>>william
>> > locksman
>> > Sent: 26 March 2002 16:34
>> > To: xsl-list@lists.mulberrytech.com
>> > Subject: [xsl] sequence numbering
>> >
>> >
>> > <products>
>> >   <product id = "1">
>> >   <name>product1</name>
>> >    <weight>56</weight>
>> >    <color>blue</color>
>> >   </product>
>> >   <product id = "2">
>> >    <name>product2</name>
>> >    <weight>56</weight>
>> >    <color>red</color>
>> >   </product>
>> >   <product id = "3">
>> >   <name>product3</name>
>> >    <weight>56</weight>
>> >    <color>red</color>
>> >   </product>
>> >   <product id = "4">
>> >   <name>product4</name>
>> >    <weight>56</weight>
>> >    <color>blue</color>
>> >   </product>
>> >   <product id = "5">
>> >    <name>product5</name>
>> >    <weight>56</weight>
>> >    <color>blue</color>
>> >   </product>
>> > </products>
>> >
>> > for the above xml for all the color elements in the xml 
>>file,
>> > get the products.. in other words group the products based 
>>on
>> > there colors
>> > and then assosiate the products with a serial num . This 
>>serial id
>> > is
>> > in the series of 1,2,3... 1 for the first product that is of 
>>a
>> > perticular color, 2 for the next product and so on..
>> >
>> > xsl i wrote..
>> >
>> > <?xml version="1.0"?>
>> > <xsl:stylesheet version="1.0"
>> > xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>> > <xsl:template match="/">
>> > <xsl:for-each select="//product/color">
>> > <xsl:sort select="." data-type="text" order="descending"/>
>> > <xsl:number format="1" count="product"/> ...<xsl:value-of
>> > select="."/>..<xsl:value-of select="../name"/>
>> > <br></br>
>> > </xsl:for-each>
>> > </xsl:template>
>> > </xsl:stylesheet>
>> >
>> > with above xsl , I am getting an out put
>> >
>> > 3 ...red..product3
>> >
>> > 2 ...red..product2
>> >
>> > 5 ...blue..product5
>> >
>> > 4 ...blue..product4
>> >
>> > 1 ...blue..product1
>> >
>> > which is quite understandable... But i wanted the output 
>>which
>> > should look like
>> >
>> > 1 ...red..product3
>> >
>> > 2 ...red..product2
>> >
>> > 1 ...blue..product5
>> >
>> > 2 ...blue..product4
>> >
>> > 3 ...blue..product1
>> >
>> > that is for each of the colors of the same type i need the
>> > sequence number to start from 1
>> >
>> > any suggestions and ideas will be most appreciated and 
>>helpful
>> > many thanks in advance
>> > bill..
>> >
>> >
>> >  XSL-List info and archive:  
>>http://www.mulberrytech.com/xsl/xsl-list
>> >
>>
>>
>>  XSL-List info and archive:  
>>http://www.mulberrytech.com/xsl/xsl-list
>>
>
>
>XSL-List info and archive:  
>http://www.mulberrytech.com/xsl/xsl-list
>


 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]