Subject: RE: [xsl] 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: [xsl] 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
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] key grouping with non-exi, Michael Kay | Thread | [xsl] C++ Engines, Alan Gutierrez |
Re: [xsl] types of input..., Tobias Reif | Date | RE: [xsl] 'Problems getting '&' out, Julian Reschke |
Month |