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: sequence numbering.


william,

Your problem comes from calling the key from within the node processing 
on the sorted node-set.

(Apparently the key is not available from within that node-set? Anyone? 
I read once something about it being a different document space)

You create a sorted node-set, $sorted-color,  and then try to access the 
key from within the processing for that node-set
<xsl:for-each select="xalan:nodeset($sorted-color)/product">
    <xsl:value-of select="key('color',this_color)"/>
</xsl:for-each>

Instead you should do
<xsl:for-each select="/products/product">
<xsl:sort select="./color" data-type="text" order="descending"/>
    <xsl:value-of select="key('color',this_color)"/>
</xsl:for-each>

Chuck Paussa

william locksman wrote:

> 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
>




 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]