How do I extract a repeating attribute value out to display it only once (using XSLT 1.0).

Discussion in 'XML' started by mark4asp, Mar 4, 2008.

  1. mark4asp

    mark4asp Guest

    Apologies, I just can't get my head around xslt but I need to do this.

    I have an xml file with two attributes per product. One of the
    attributes repeats to produce several groups (3 in the example, grouped
    by region). How can I select this repeating attribute out as a header
    column in a table with the other attribute as in a data column. (see
    example html). XSLT 1.0 solutions only please (or whatever is
    compatible with current major browser parsers [FF, IE6, IE7, Opera,
    Safari]).

    source xml:

    <sales>
    <product region="NW" item="Drill" />
    <product region="NW" item="Fork" />
    <product region="NW" item="Spade" />
    <product region="SE" item="Brick" />
    <product region="SE" item="Hammer" />
    <product region="SE" item="Nail" />
    <product region="SW" item="Chisel" />
    <product region="SW" item="Screw" />
    </sales>

    target html:

    <html>
    <body>
    <table>
    <tr><th>NW</th></tr>
    <tr><td>Drill</td></tr>
    <tr><td>Fork</td></tr>
    <tr><td>Spade</td></tr>
    <tr><th>SE</th></tr>
    <tr><td>Brick</td></tr>
    <tr><td>Hammer</td></tr>
    <tr><td>Nail</td></tr>
    <tr><th>SW</th></tr>
    <tr><td>Chisel</td></tr>
    <tr><td>Screw</td></tr>
    </table>
    </body>
    </html>
     
    mark4asp, Mar 4, 2008
    #1
    1. Advertising

  2. Re: How do I extract a repeating attribute value out to display itonly once (using XSLT 1.0).

    mark4asp wrote:
    > Apologies, I just can't get my head around xslt but I need to do this.
    >
    > I have an xml file with two attributes per product. One of the
    > attributes repeats to produce several groups (3 in the example, grouped
    > by region). How can I select this repeating attribute out as a header
    > column in a table with the other attribute as in a data column. (see
    > example html). XSLT 1.0 solutions only please (or whatever is
    > compatible with current major browser parsers [FF, IE6, IE7, Opera,
    > Safari]).


    It is a grouping problem, solved in XSLT 1.0 using Muenchian grouping:

    <xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:eek:utput method="html" indent="yes"/>

    <xsl:key name="by-region" match="product" use="@region"/>

    <xsl:template match="sales">
    <html lang="en">
    <head>
    <title>Example</title>
    </head>
    <body>
    <table>
    <tbody>
    <xsl:apply-templates
    select="product[generate-id() =
    generate-id(key('by-region', @region)[1])]" mode="th"/>
    </tbody>
    </table>
    </body>
    </html>
    </xsl:template>

    <xsl:template match="product" mode="th">
    <tr>
    <th><xsl:value-of select="@region"/></th>
    </tr>
    <xsl:apply-templates select="key('by-region', @region)" mode="td"/>
    </xsl:template>

    <xsl:template match="product" mode="td">
    <tr>
    <td><xsl:value-of select="@item"/></td>
    </tr>
    </xsl:template>

    </xsl:stylesheet>

    --

    Martin Honnen
    http://JavaScript.FAQTs.com/
     
    Martin Honnen, Mar 4, 2008
    #2
    1. Advertising

  3. In article <023e2a0a$0$20024$>,
    mark4asp <> wrote:

    >I have an xml file with two attributes per product. One of the
    >attributes repeats to produce several groups (3 in the example, grouped
    >by region). How can I select this repeating attribute out as a header
    >column in a table with the other attribute as in a data column.


    You may find this helpful:

    http://www.jenitennison.com/xslt/grouping/muenchian.xml

    -- Richard
    --
    :wq
     
    Richard Tobin, Mar 4, 2008
    #3
  4. mark4asp

    mark4asp Guest

    Re: How do I extract a repeating attribute value out to display itonly once (using XSLT 1.0).

    Martin Honnen wrote:

    > mark4asp wrote:
    > > Apologies, I just can't get my head around xslt but I need to do
    > > this.
    > >
    > > I have an xml file with two attributes per product. One of the
    > > attributes repeats to produce several groups (3 in the example,
    > > grouped by region). How can I select this repeating attribute out
    > > as a header column in a table with the other attribute as in a data
    > > column. (see example html). XSLT 1.0 solutions only please (or
    > > whatever is compatible with current major browser parsers [FF, IE6,
    > > IE7, Opera, Safari]).

    >
    > It is a grouping problem, solved in XSLT 1.0 using Muenchian grouping:
    >
    > <xsl:stylesheet
    > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    > version="1.0">
    >
    > <xsl:eek:utput method="html" indent="yes"/>
    >
    > <xsl:key name="by-region" match="product" use="@region"/>
    >
    > <xsl:template match="sales">
    > <html lang="en">
    > <head>
    > <title>Example</title>
    > </head>
    > <body>
    > <table>
    > <tbody>
    > <xsl:apply-templates
    > select="product[generate-id() =
    > generate-id(key('by-region', @region)[1])]" mode="th"/>
    > </tbody> </table>
    > </body>
    > </html>
    > </xsl:template>
    >
    > <xsl:template match="product" mode="th">
    > <tr>
    > <th><xsl:value-of select="@region"/></th>
    > </tr>
    > <xsl:apply-templates select="key('by-region', @region)"
    > mode="td"/> </xsl:template>
    >
    > <xsl:template match="product" mode="td">
    > <tr>
    > <td><xsl:value-of select="@item"/></td>
    > </tr>
    > </xsl:template>
    >
    > </xsl:stylesheet>



    Thanks Richard and Martin. For some reason the example code in O'Reilly
    XSLT Cookbook 2e, for Muenchian grouping did not work (no details only
    a summary) and poking about with it didn't make it work. In fact, only
    the first grouping example in chapter 10 (Recipe 10.3. Creating HTML
    Tables) would work for me in FF.

    I will def. read the article Richard posted.
     
    mark4asp, Mar 4, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Iain
    Replies:
    9
    Views:
    1,481
  2. bprimuslevy
    Replies:
    1
    Views:
    470
    Soren Kuula
    Aug 23, 2006
  3. =?UTF-8?b?5byg6Z+h5q2m?=
    Replies:
    3
    Views:
    754
    DeepthiShri
    Oct 23, 2006
  4. Stefan_W
    Replies:
    1
    Views:
    8,389
    Stefan_W
    Nov 5, 2008
  5. Guest
    Replies:
    2
    Views:
    167
    Bob Barrows [MVP]
    Feb 20, 2006
Loading...

Share This Page