[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: key grouping with non-existing or empty elements

Subject: Re: key grouping with non-existing or empty elements
From: Joerg Heinicke <joerg.heinicke@xxxxxx>
Date: Sat, 04 Jan 2003 20:01:44 +0100
not equals in string
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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.