xsl-list
[Top] [All Lists]

Re: Grouping problem - Duplicates

2004-05-01 00:39:20
Hi Mukul,

Thanks so much for this solution. I am still trying to understand its' details. As I said, I am new, and your xslt is complicated for me. But, I have two concerns, that maybe you can help me with. The first is that when I run your xslt, I only get content (that is: sales people per area) for the first sorted area (Center). the other two are empty, though I would expect them to have their sales people. The second is, that this solution is product-dependent. By using the xalan:nodeset function, it limits the solution to a certain product.
Is there no other way that would be generic? (This is for me a requirement).

Thanks again,
Sarah


At 19:48 30/4/2004, you wrote:
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
>