Subject: RE: key grouping with non-existing or empty elements
From: Xiaocun Xu <xiaocunxu@xxxxxxxxx>
Date: Mon, 6 Jan 2003 09:21:47 -0800 (PST)
|
Thanks for pointing out my mistake. In Joerg's
solution, I did not see "string()" in the "use"
attribute. Once I add it, it worked!
Thanks,
Xiaocun
--- Michael Kay <michael.h.kay@xxxxxxxxxxxx> wrote:
> The "use" attribute identifies a set of values that
> can each be used to
> find the "match" item. For example, match="book"
> use="author" will index
> the book by each of its authors. If the book has no
> authors, then it
> will not be indexed and no key() expression using
> this key will find it.
>
> If books have zero-or-one authors, then you can
> write match="book"
> use="string(author)", and a book with no authors
> will then be
> retrievable using the key value "".
>
> Michael Kay
> Software AG
> home: Michael.H.Kay@xxxxxxxxxxxx
> work: Michael.Kay@xxxxxxxxxxxxxx
>
> > -----Original Message-----
> > From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On
> Behalf Of Xiaocun Xu
> > Sent: 03 January 2003 19:48
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: Re: key grouping with non-existing
> or empty elements
> >
> >
> > 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
> > > > > $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
> > >
> > >
> > >
> > >
> > > 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
> >
>
=== message truncated ===
__________________________________________________
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
|