Hi Sarah,
I rewrote the XSL. I have not used HTML tags in my
stylesheet. Hope you can adapt it for yourself.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
exclude-result-prefixes="xalan">
<xsl:output method="text" version="1.0"
encoding="UTF-8" indent="yes"/>
<xsl:key name="by-area1"
match="/Company/Suppliers/Area/*" use="name()"/>
<xsl:key name="by-area2" match="area" use="@name"/>
<xsl:key name="by-name" match="Name"
use="concat(FirstName,':',LastName)"/>
<xsl:template match="/Company/Suppliers">
<xsl:variable name="rtf1">
<xsl:for-each select="Area/*">
<xsl:if test="generate-id(.) =
generate-id(key('by-area1', name())[1])">
<xsl:for-each select="key('by-area1', name())">
<area name="{name()}">
<xsl:value-of select="."/>
</area>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="rtf3">
<xsl:for-each select="SalesPeople/SalesPerson">
<xsl:variable name="rtf2">
<Name>
<LastName>
<xsl:value-of select="Name/LastName"/>
</LastName>
<FirstName>
<xsl:value-of select="Name/FirstName"/>
</FirstName>
</Name>
</xsl:variable>
<xsl:for-each select="Supplier">
<xsl:variable name="supplier" select="."/>
<xsl:for-each select="xalan:nodeset($rtf1)/area">
<xsl:if test="text() = $supplier">
<area name="{(_at_)name}">
<Name>
<LastName>
<xsl:value-of
select="xalan:nodeset($rtf2)/Name/LastName"/>
</LastName>
<FirstName>
<xsl:value-of
select="xalan:nodeset($rtf2)/Name/FirstName"/>
</FirstName>
</Name>
</area>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="rtf4">
<xsl:for-each select="xalan:nodeset($rtf3)/area">
<xsl:if test="generate-id(.) =
generate-id(key('by-area2', @name)[1])">
<area name="{(_at_)name}">
<xsl:for-each select="key('by-area2', @name)">
<Name>
<LastName>
<xsl:value-of select="Name/LastName"/>
</LastName>
<FirstName>
<xsl:value-of select="Name/FirstName"/>
</FirstName>
</Name>
</xsl:for-each>
</area>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:for-each select="xalan:nodeset($rtf4)/area">
<xsl:sort select="@name"/>
<xsl:value-of select="@name"/><xsl:text>
</xsl:text>
<xsl:variable name="rtf5">
<xsl:copy-of select="."/>
</xsl:variable>
<xsl:for-each
select="xalan:nodeset($rtf5)/area/Name">
<xsl:if test="generate-id(.) =
generate-id(key('by-name',
concat(FirstName,':',LastName))[1])">
<xsl:value-of select="FirstName"/><xsl:text>
</xsl:text>
<xsl:value-of select="LastName"/><xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Regards,
Mukul
--- Sarah <sarah10(_at_)GameBox(_dot_)net> wrote:
Here is a copy of my XML file called Company.xml:
<Company>
<Suppliers>
<Area>
<North>Supp 1 Nor</North>
<South>Supp 1 Sou</South>
<Center>Supp 1
Cntr</Center>
<North>Supp 2 Nor</North>
<North>Supp 3 Nor</North>
<South>Supp 2 Sou</South>
<South>Supp 3 Sou</South>
<Center>Supp 2
Cntr</Center>
<Center>Supp 3
Cntr</Center>
<North>Smith Suppliers
LTD.</North>
<South>Smith Suppliers
LTD.</South>
<Center>Sundance suppliers
Cntr</Center>
</Area>
<SalesPeople>
<SalesPerson>
<Name>
<LastName>lName Supp 1</LastName>
<FirstName>John</FirstName>
</Name>
<Title>Manager</Title>
<Supplier>Supp 1
Nor</Supplier>
<Supplier>Supp 1
Sou</Supplier>
<Supplier>Supp 1
Cntr</Supplier>
<Supplier>Supp 2
Cntr</Supplier>
<Supplier>Supp 3
Cntr</Supplier>
<Supplier>Smith
Suppliers LTD.</Supplier>
<Supplier>Smith
Suppliers LTD.</Supplier>
<Supplier>Sundance
suppliers Cntr</Supplier>
</SalesPerson>
<SalesPerson>
<Name>
<LastName>lName Supp 2</LastName>
<FirstName>Kathy</FirstName>
</Name>
<Title>CEO</Title>
<Supplier>Supp 2
Nor</Supplier>
<Supplier>Supp 2
Sou</Supplier>
<Supplier>Supp 2
Cntr</Supplier>
<Supplier>Supp 1
Cntr</Supplier>
<Supplier>Supp 2
Cntr</Supplier>
<Supplier>Supp 3
Cntr</Supplier>
<Supplier>Smith
Suppliers LTD.</Supplier>
</SalesPerson>
<SalesPerson>
<Name>
<LastName>lName Supp 3</LastName>
<FirstName>Dan</FirstName>
</Name>
<Title>Dr.</Title>
<Supplier>Supp 3
Nor</Supplier>
<Supplier>Supp 3
Sou</Supplier>
<Supplier>Supp 3
Cntr</Supplier>
<Supplier>Supp 1
Cntr</Supplier>
<Supplier>Supp 2
Cntr</Supplier>
<Supplier>Supp 3
Cntr</Supplier>
<Supplier>Smith
Suppliers LTD.</Supplier>
<Supplier>Smith
Suppliers LTD.</Supplier>
<Supplier>Sundance
suppliers Cntr</Supplier>
</SalesPerson>
<SalesPerson>
<Name>
<LastName>lName Apprentice</LastName>
<FirstName>George</FirstName>
</Name>
<Title>Apprentice</Title>
<Supplier>Supp 3
Nor</Supplier>
</SalesPerson>
<SalesPerson>
<Name>
<LastName>lName Samuel</LastName>
<FirstName>Dave</FirstName>
</Name>
<Title>Developer</Title>
<Supplier>Supp 3
Nor</Supplier>
<Supplier>Supp 3
Sou</Supplier>
<Supplier>Supp 3
Cntr</Supplier>
<Supplier>Supp 1
Cntr</Supplier>
<Supplier>Supp 2
Cntr</Supplier>
</SalesPerson>
</SalesPeople>
</Suppliers>
</Company>
I would like to see the following output:
Sales People by Areas
Center
Dave lName Samuel
John lName Supp 1
Kathy lName Supp 2
Dan lName Supp 3
North
John lName Supp 1
Kathy lName Supp 2
George lName Apprentice
Dave lName Samuel
Dan lName Supp 3
South
John lName Supp 1
Kathy lName Supp 2
Dave lName Samuel
Dan lName Supp 3
But I get:
Sales People by Areas
Center
Dave lName Samuel
John lName Supp 1
Kathy lName Supp 2
Dan lName Supp 3
Dave lName Samuel
John lName Supp 1
Kathy lName Supp 2
Dan lName Supp 3
Dave lName Samuel
John lName Supp 1
Kathy lName Supp 2
Dan lName Supp 3
John lName Supp 1
Dan lName Supp 3
North
John lName Supp 1
Kathy lName Supp 2
George lName Apprentice
Dave lName Samuel
Dan lName Supp 3
John lName Supp 1
Kathy lName Supp 2
Dan lName Supp 3
South
John lName Supp 1
Kathy lName Supp 2
Dave lName Samuel
Dan lName Supp 3
John lName Supp 1
Kathy lName Supp 2
Dan lName Supp 3
This is the stylesheet I used (called:
sales_by_area.xsl):
<xsl:key name="areas" match="//Area/*"
use="name()"/>
<xsl:key name="supplier-list" match="SalesPerson"
use="Supplier"/>
<xsl:key name="fullName" match="SalesPerson"
use="Name"/>
<xsl:template match="/">
<html>
<head>
<meta http-equiv="content-type"
content="text/html" />
<meta name="description"
content="Suppliers by Sales
People" />
<link href="text.css"
rel="stylesheet" type="text/css" />
<title>Your company</title>
</head>
<body>
<h1>Sales People by Areas <br
/></h1>
<xsl:for-each
select="//Area/*[generate-id(.)=generate-id(key('areas',
name()))]">
<xsl:sort
select="key('areas', name())"/>
<h2><xsl:value-of
select="name()"/></h2>
<xsl:for-each
select="key('areas', name())">
<xsl:sort
select="key('areas', text())"/>
<xsl:variable
name="supplier_name"
select="text()">
</xsl:variable>
<xsl:variable
name="area_name"
select="name()">
</xsl:variable>
<xsl:for-each
select="//SalesPerson[generate-id()=generate-id(key('fullName',
Name))]">
<xsl:sort
select="key('fullName',
Name)"/>
<xsl:apply-templates select="Name">
<xsl:with-param name="curr_supp"
select="$supplier_name"/>
<xsl:with-param name="curr_area"
select="$area_name"/>
</xsl:apply-templates>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</body>
</html>
</xsl:template>
<xsl:template match="Name">
<xsl:param name="curr_supp"/>
<xsl:param name="curr_area"/>
<xsl:variable name="fName" select=".">
</xsl:variable>
<xsl:for-each
select="//SalesPerson[generate-id()=generate-id(key('supplier-list',
Supplier))]">
<xsl:sort
select="key('supplier-list', Supplier)"/>
<xsl:for-each
select="key('supplier-list', $curr_supp)">
<xsl:if test="$fName =
Name">
<xsl:if test="Supplier =
$curr_supp">
<p
class="textenglish">
<xsl:value-of
select="Name/FirstName"/>
<xsl:text>
</xsl:text>
<xsl:value-of
select="Name/LastName"/> <br />
</p>
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
__________________________________
Do you Yahoo!?
Win a $20,000 Career Makeover at Yahoo! HotJobs
http://hotjobs.sweepstakes.yahoo.com/careermakeover