xsl-list
[Top] [All Lists]

RE: [xsl] Re: Structuring multiple HTML tables based on the value of a child node

2007-06-05 06:15:55
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(_at_)gmail(_dot_)com] 
Sent: 05 June 2007 13:15
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] 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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--