Help needed with XSL

R

Rohit

I have a XML which looks like this:

<root>
<row Site="ABC" ClassroomName="Calculus" StartDate="Jun 1 2004"/>
<row Site="ABC" ClassroomName="Biology" StartDate="Jun 10 2004"/>
<row Site="XYZ" ClassroomName="History" StartDate="Jun 12 2004"/>
<row Site="XYZ" ClassroomName="English" StartDate="Jun 1 2004"/>
</root>

I want this to be displayed in a <table> as
----------------------------------------------
ABC
ClassroomName StartDate
Calculus June 1 2004
Biology June 10 2004

XYZ
ClassroomName StartDate
History June 12 2004
English June 1 2004
----------------------------------------------

As you can see, the 'Site' goes first, then we have column headings
for Classroom and Date, then the rows belonging to that 'site'. The
XML is always sorted on 'Site'.

This is what I have been come up with:
------------------------------------------------------------------------------
<xsl:template match="/">
<table width="100%">
<tr>
<td><b>Site</b></td>
<td><b>ClassroomName</b></td>
<td><b>Start Date</b></td>
</tr>
<xsl:apply-templates select="ROOT/row" />
</table>
</xsl:template>

<xsl:template match="ROOT/row">
<tr>
<td><xsl:value-of select="@Site"></xsl:value-of></td>
<td><xsl:value-of select="@ClassroomName"></xsl:value-of></td>
<td><xsl:value-of select="@StartDate"></xsl:value-of>
</tr>
</xsl:template>
--------------------------------------------------------------------

Can somebody please advice me how to get the above formatting by
modifying this xsl template.

Thanks,
Rohit
 
?

=?ISO-8859-1?Q?R=E9mi_Peyronnet?=

Can somebody please advice me how to get the above formatting by
modifying this xsl template.

You have to get distinct @Site values. This trick is done in xslt by
using key() feature. There is a nice template in the excellent Cooktop
xml editor.

You can also choose to use a less standard thing as e-xslt
(www.exslt.org) which provide a distinct function
(http://www.exslt.org/set/functions/distinct/index.html)

Here is a working xsl (consider some improvement in the key to avoid the
//row select) :

---------------------------------------------------------------------
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="site" match="@Site" use="."/>


<xsl:template match="/">

<!-- the key declaration must be global ! -->

<!--
substitute xpath with xpath to your xpath to the node to iterate
substitute @att with the name of the attribute or . for txt node.
-->
<xsl:for-each select="root/*[count(@Site | key('site', @Site)[1]) = 1]">

<b><xsl:value-of select="@Site" /></b>

<table width="100%">
<tr>
<td><b>ClassroomName</b></td>
<td><b>Start Date</b></td>
</tr>
<xsl:apply-templates select="//row[@Site=current()/@Site]" />
</table>
</xsl:for-each>
</xsl:template>

<xsl:template match="row">
<tr>
<td><xsl:value-of select="@ClassroomName" /></td>
<td><xsl:value-of select="@StartDate" /></td>
</tr>
</xsl:template>

</xsl:stylesheet>
 

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,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top