This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: sequence numbering.
- From: Chuck Paussa <cpaussa at yahoo dot com>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Tue, 02 Apr 2002 12:23:12 -0800
- Subject: Re: [xsl] sequence numbering.
- References: <20020402160452.28025.qmail@mailweb23.rediffmail.com>
- Reply-to: xsl-list at lists dot mulberrytech dot com
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>
</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