[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Showing unique rows at multiple levels

Subject: Showing unique rows at multiple levels
From: Glen Mazza <grm7790@xxxxxxxxxxx>
Date: Wed, 04 Oct 2006 14:07:44 -0400
unique bookshelf
Hello, for this input XML:

<books>
   <book>
       <title>T1</title>
       <author>A5</author>
       <publisher>P7</publisher>
       <bookshelf>B4</bookshelf>
   </book>
   <book>
       <title>T2</title>
       <author>A6</author>
       <publisher>P8</publisher>
       <bookshelf>B4</bookshelf>
   </book>
   <book>
       <title>T4</title>
       <author>A5</author>
       <publisher>P7</publisher>
       <bookshelf>B6</bookshelf>
   </book>
   <book>
       <title>T3</title>
       <author>A5</author>
       <publisher>P7</publisher>
       <bookshelf>B4</bookshelf>
   </book>
</books>

I would like an alphabetically sorted list of each unique bookshelf, and under each bookshelf, each unique author of at least one book on that shelf, and under each author, each unique publisher of at least one book by that author (on that shelf).

I.e., for the above, the following is desired:

B4
--A5   (show just once even though 2 books of A5)
----P7 (show just once even though 2 books of P7 under A5 on B4)
--A6
----P8
B6
--A5
----P7

Unfortunately, I am getting this:

B4
--A5
----P7
--A6
----P8
B6

where A5 and P7 are erroneously missing under shelf B6, because A5 and P7 already happen to exist under shelf B4. (In my sample data, if I rename A5 to say A15 and P7 to P17, i.e., nodes that don't exist elsewhere, these nodes then *will* appear under B6.)

Something is wrong with my filtering--I only want an author to be suppressed if it is already listed for the *same* shelf, and likewise with publishers under the same author (under the same shelf).

Here is my XSLT:

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

<xsl:template match="books">
   <xsl:for-each select="//bookshelf[not(.=preceding::bookshelf)]">
        <xsl:sort select="."/>
        <xsl:apply-templates select='.'/>
   </xsl:for-each>
</xsl:template>

<xsl:template match="bookshelf">
<xsl:variable name="bookshelfVar" select="."/>
<xsl:variable name="authorVar" select="../author"/>
<xsl:value-of select="."/>
<xsl:for-each select="//book[(bookshelf = $bookshelfVar)]/author[not(.=preceding::author)]">
<xsl:sort select="."/>
<xsl:apply-templates select='.'/>
</xsl:for-each>
</xsl:template>


<xsl:template match="author">
<xsl:variable name="bookshelfVar" select="../bookshelf"/>
<xsl:variable name="authorVar" select="."/>
--<xsl:value-of select="."/>
<xsl:for-each select="//book[(bookshelf = $bookshelfVar) and (author = $authorVar)]/publisher[not(.=preceding::publisher)]">
<xsl:sort select="."/>
<xsl:apply-templates select='.'/>
</xsl:for-each>
</xsl:template>


<xsl:template match="publisher">
    ----<xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

Can anyone see what I am doing wrong? Any help would be appreciated.

Thanks,
Glen

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.