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