Subject: Re: [xsl] key grouping with non-existing or empty elements From: Joerg Heinicke <joerg.heinicke@xxxxxx> Date: Mon, 30 Dec 2002 05:25:19 +0100 |
<xsl:template match="rootelement"> <table border="1"> <xsl:apply-templates select="row[generate-id() = generate-id(key('rows', string(cell[@column='6'])))]" mode="start-group"/> </table> </xsl:template>
<xsl:template match="row" mode="start-group"> <tr> <td>starting a new group with content of column 6: "<xsl:text/> <xsl:value-of select="cell[@column='6']"/>"<xsl:text/> </td> </tr> <xsl:apply-templates select="key('rows', string(cell[@column='6']))"/> </xsl:template>
<xsl:template match="row"> <tr> <td> <xsl:value-of select="cell[@column='1']"/> </td> </tr> </xsl:template>
Hi,
I have a question regarding grouping with key. Following is the input XML example:
<row row="1"> <cell column="1">default_item1</cell> <cell column="6"></cell> </row> <row row="2"> <cell column="1">default_item2</cell> </row> <row row="3"> <cell column="1">lot01_item1</cell> <cell column="6">lot01</cell> </row> <row row="4"> <cell column="1">lot02_item2</cell> <cell column="6">lot02</cell> </row>
I have a number of items that need to be grouped by lot (cell[column=6]). As you can see, this cell is optional. I need to group rows that does not have cell[6] and rows have cell[6] as empty string into the same group, then process each of the row within the group via: <xsl:apply-templates select="key('lineitemLotsKey', $lotName)" mode="LineItem"/>
The way I currently handling this is not very elegent: 1. create a key on lot (cell 6) for all rows with cell 6 element: <xsl:variable name="LineItemLotColumn" select="6"/> <xsl:key name="lineitemLotsKey" match="//row[@row > $LineItemHeaderRow and (cell[@column=$LineItemLotColumn])]" use="cell[@column=$LineItemLotColumn]"/> 2. create a separate variable that contains rows that does not have cell 6 element: <xsl:variable name="LineItemDefaultLot" select="//row[@row > $LineItemHeaderRow and not(cell[@column=$LineItemLotColumn])]"/> 3. process $LineItemDefaultLot separately. 4. when process rows in key lineitemLotsKey, check for string(cell[6]). If empty, then does similar processing as #3.
Of course, a slight improvement would be for #2, instead of get all rows that does not have cell 6 element, also get all rows that has cell 6 element equal to empty string. That way, I would not need to check for string(cell[6]) in step #4.
Is there a more elegent way than these above?
Thanks,
Xiaocun xiaocunxu@xxxxxxxxx
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] key grouping with non-existin, Xiaocun Xu | Thread | [xsl] use variable as node-set for , Xiaocun Xu |
Re: [xsl] Sorting and grouping, Joerg Heinicke | Date | Re: [xsl] Conditional branching on , Joerg Heinicke |
Month |