Re: [xsl] key grouping with non-existing or empty elements

Subject: Re: [xsl] key grouping with non-existing or empty elements
From: Joerg Heinicke <joerg.heinicke@xxxxxx>
Date: Sat, 04 Jan 2003 20:01:44 +0100
Hello Xiaocun,

it should work. So I can't tell you what's wrong without knowing your stylesheet or in which context you used these <xsl:apply-templates/> below. Maybe you have no template with mode attribute. Or the key declaration is wrong. Or the element is matched by the wrong template.

For a test you can add a template like the following:

<xsl:template match="*" mode="LineItem">
matched on element <xsl:value-of select="name()"/>.
</xsl:template>

Without knowing your stylesheet I can only say that even the test can fail, if there is another template similar to the above one, that matches the elements with a higher priority. And if you set the priority to a high value(using priority="20" or so), the normal behaviour of the stylesheet can fail.

Regards,

Joerg

Xiaocun Xu wrote:
Hi, Joerg:

  I tried:
<xsl:apply-templates select="key('lineitemLotsKey',
string(''))" mode="LineItem"/>
and
<xsl:apply-templates select="key('lineitemLotsKey',
'')" mode="LineItem"/>
both did not find the rows with non-existing or empty
key elements.  Any particular caution I need to pay
here?

Thanks,
Xiaocun

--- Joerg Heinicke <joerg.heinicke@xxxxxx> wrote:

Hello Xiaocun,

getting what you want is really simple using keys,
you only must set it
up as top-level element and use
string(cell[@column='6']) as grouping key. So both non-existing element and empty element
are evaluated to empty string "":


<xsl:key name="rows" match="row"
use="string(cell[@column='6'])"/>

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

Regards,

Joerg

Xiaocun Xu wrote:

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
&gt; $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 &gt; $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




XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list




__________________________________________________ Do you Yahoo!? Yahoo! Mail Plus - Powerful. Affordable. Sign up now. http://mailplus.yahoo.com

XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list




XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list


Current Thread