Subject: [xsl] Grouping and Sorting on value inside group From: "Hunsberger, Peter" <Peter.Hunsberger@xxxxxxxxxx> Date: Mon, 10 Jun 2002 16:55:51 -0500 |
As I've mentioned a couple of times recently I have a problem with keys that I've been having trouble with. Basically, I have to rotate some data x | c b a d y | e _ d _ z | _ h f g to x y z -------- c e _ b _ h a d f d _ g Where there is a common id to group on. Moreover I need to sort the resultant rows based on a variable that will name a particular column. Essentially, I have some XML of the form: <dataset> <groupa> <data_x dataid="1"> <value>c</value> </data> <data_x dataid="2"> <value>b</value> </data> <data_x dataid="3"> <value>a</value> </data> <data_x dataid="4"> <value>d</value> </data> <data_y dataid="1"> <value>e</value> </data> <data_y dataid="2"/> <data_y dataid="3"> <value>d</value> </data> <data_y dataid="4"/> <data_z dataid="1"/> <data_z dataid="2"> <value>h</value> </data> <data_z dataid="3"> <value>f</value> </data> <data_z dataid="4"> <value>g</value> </data> </groupa> </dataset> This needs to be transformed into: <groupa> <data_x dataid="1"> <value>c</value> </data> <data_y dataid="1"> <value>e</value> </data> <data_z dataid="1"/> <data_x dataid="2"> <value>b</value> </data> <data_y dataid="2"/> <data_z dataid="2"> <value>h</value> </data> <data_x dataid="3"> <value>a</value> </data> <data_y dataid="3"> <value>d</value> </data> <data_z dataid="3"> <value>f</value> </data> <data_x dataid="4"> <value>d</value> </data> <data_y dataid="4"/> <data_z dataid="4"> <value>g</value> </data> </groupa> Where there could be multiple groups, but the "data" elements in each group are unique. I can do the grouping using: <xsl:key name="dataids" match="dataset/*/*" use="concat(local-name(..),@dataId)"/> and then several templates down: <xsl:for-each select="//dataset/*/*[generate-id() = generate-id(key('dataids', concat(local-name(..),@dataId)))]"> but this has the disadvantage of using the // reference to the dataset node. Is it possible to use an additional(?) key to do this more efficiently? Since the groups are distinct I believe I don't need to concat with local-name() but simply "use" @dataid. Does using the local-name help or hurt? Next, is it possible to sort this grouping by the text of the value nodes? Eg; if I get passed a parameter of "data_y" I'd like to sort the "data" nodes by the ordering of the id's corresponding to the values in the "data_y" node. In this case: <groupa> <data_x dataid="3"> <value>a</value> </data> <data_y dataid="3"> <value>d</value> </data> <data_z dataid="3"> <value>f</value> </data> <data_x dataid="1"> <value>c</value> </data> <data_y dataid="1"> <value>e</value> </data> <data_z dataid="1"/> <data_x dataid="2"> <value>b</value> </data> <data_y dataid="2"/> <data_z dataid="2"> <value>h</value> </data> <data_x dataid="4"> <value>d</value> </data> <data_y dataid="4"/> <data_z dataid="4"> <value>g</value> </data> </groupa> I'm fine with nodes with no value text child node being sorted first or last... This can be done as a two stage transformation; the sorting can be done first or in the same transformation as the grouping, but the grouping has to be done in the last transformation. Peter Hunsberger Phone: 901-495-5252 E-mail: Peter.Hunsberger@xxxxxxxxxx XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] ANN: update to XSLToolbox, Josh Lubell | Thread | Re: [xsl] Grouping and Sorting on v, Jeni Tennison |
[xsl] ANN: update to XSLToolbox, Josh Lubell | Date | [xsl] netscape won't display anythi, Ming |
Month |