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

M

mark4asp

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>
 
M

Martin Honnen

mark4asp said:
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>
 
M

mark4asp

Martin said:
mark4asp said:
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.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top