Subject: RE: Re: Structuring multiple HTML tables based on the value of a child node
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Tue, 5 Jun 2007 13:26:17 +0100
|
You failed to guess the right keyword: "grouping".
This is a classic grouping problem. In XSLT 2.0 such problems are easy, use
xsl:for-each-group. In XSLT 1.0 they are much harder, except that the code
has been written many times. See http://www.jenitennison.com/xslt/grouping.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Mark Peters [mailto:flickrmeister@xxxxxxxxx]
> Sent: 05 June 2007 13:15
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: Structuring multiple HTML tables based on
> the value of a child node
>
> Hi Everyone,
>
> Sorry for the long subject line. I've been reading Dave
> Pawson's site for a starting point on a particular project,
> but I'm not even sure how to distill it into browse/search
> terms. None of the general headings I've explored seem to
> quite describe it.
>
> Here's what I'm trying to do. I'd like to structure my data
> as multiple HTML tables based on the value of a child node.
>
> For example, in the sample input file below, I'd like to
> generate three HTML tables, one for each <color> value. The
> tables would include two columns: Name and Shape. The table
> rows display the name and shape data for each color. The
> <table> element would include an id attribute that contains
> the <color> value.
>
>
> Sample input file:
>
> <signs>
> <sign>
> <name>stop</name>
> <shape>hexagon</shape>
> <color>red</color>
> </sign>
> <sign>
> <name>yield</name>
> <shape>triangle</shape>
> <color>yellow</color>
> </sign>
> <sign>
> <name>steep incline</name>
> <shape>diamond</shape>
> <color>yellow</color>
> </sign>
> <sign>
> <name>slippery when wet</name>
> <shape>diamond</shape>
> <color>yellow</color>
> </sign>
> <sign>
> <name>city name</name>
> <shape>rectangle</shape>
> <color>green</color>
> </sign>
> </signs>
>
>
> If I use <for-each>, I end up with a table for every <sign> element.
> How could someone create a single table for each <color> value?
>
> Here's what I have so far:
>
> <xsl:template match="\">
> <xsl:for-each select="signs/sign/color">
> <xsl:sort select="."/>
> <table frame="all" colsep="1" rowsep="1">
> <xsl:attribute name="id"><xsl:value-of
> select="."/></xsl:attribute>
> <tr>
> <th>Name</entry>
> <th>Shape</entry>
> </tr>
> <xsl:for-each select="../name">
> <xsl:sort select="."/>
> <tr>
> <td>
> <xsl:value-of select="."/>
> </td>
> <td>
> <xsl:value-of select="shape"/>
> </td>
> </tr>
> </xsl:for-each>
> </table>
> </xsl:for-each>
> </xsl:template>
>
>
> Thanks for any suggestions. I appreciate all of the help the
> kind people on this list have provided over the past year.
> I've learned a lot from reading the posts and exploring on my own.
>
> Regards,
> Mark
|