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

xsl:key only checks first child, need to check all

Subject: xsl:key only checks first child, need to check all
From: Patrick Warren <warr0120@xxxxxxx>
Date: Thu, 27 Oct 2005 20:05:59 -0500
xsl first child
I've got a bibliography in xml with an xslt stylesheet. I'm opening it in Firefox. I'm sorting the bibliography by format (audio, text, etc), then by topic (history, culture, etc.), then by author, which is where it gets tricky. I'm sorting by individual author. Then for each individual author I want works from that author alone, then works by that author and one other author, then with two other authors, etc. This last part of getting the works functions fine. The problem is with getting the individual authors grouped by format and topic, and is explained in a comment element in the xsl below.

Here's a simplified version of the xml bibliography:

<sources>
<source>
<sourceCode></sourceCode>
<date></date>
<title></title>
<authors>
<author>
<name></name>
</author>
</authors> <topics>
<topic>
<name></name>
</topic>
</topics>
<formats>
<format></format>
</formats>
</source>
</sources>


Please notice that the <topics> structure allows for multiple values - a work can be about both culture and history, and should be grouped under both topics.

Here's a simplified version of the xsl (I don't claim it's optimized!):

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


<xsl:key name = "topics" match = " contains " use = " . " />
<xsl:key name = "formats" match = " media / format " use = " . " />
<xsl:key name = "authorsByFormatAndTopic" match = " author / name " use = " concat ( . , .. / .. / .. / media / format , .. / .. / .. / topics / topic [1] / contains ) " />


<xsl:template match = "/" >

<xsl:for-each select = " sources / source / media / format [ count ( . | key ( 'formats' , . ) [ 1 ] ) = 1 ] " >

           <xsl:sort select = " . " />
           <xsl:variable name = "currentFormat" select = "." />

<xsl:value-of select = " $currentFormat " />

<xsl:for-each select = " // sources / source [ media / format = $currentFormat ] / topics / topic / contains [ count ( . | key ( 'topics' , . ) [ 1 ] ) = 1 ] " >

               <xsl:sort select = " . " />
               <xsl:variable name = "currentTopic" select = "." />

<xsl:value-of select = " $currentTopic " />

<xsl:for-each select = " // authors / author / name [ count ( . | key ( 'authorsByFormatAndTopic' , concat ( . , $currentFormat , $currentTopic ) ) [ 1 ] ) = 1 ] " >

<!-- This for-each is where the problem occurs. I want each author name for sources with a format matching $currentFormat and a topic matching $currentTopic, but I only get a positive result when the FIRST topic matches the variable. I can't get a key to check EACH of the topic elements (and I assume the same would happen with format, if I had multiple values for a source, which will surely be the case soon). So I can't get rid of the duplicates when an author has more than one work with the same format and topic, since it either doesn't find all the desired results via the authorsByFormatAndTopic key (when the matching topic happens not to be listed first in every case). -->

                   <xsl:sort select = " . " />
                   <xsl:variable name = "currentAuthor" select = "." />

<xsl:for-each select = " // sources / source [ media / format = $currentFormat and topics / topic / contains = $currentTopic ] / authors [ author [*] / name = $currentAuthor ] " >

<!-- everything works fine from this for-each on, so I cut its children out -->

</xsl:for-each>

</xsl:for-each>

</xsl:for-each>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

Any ideas for getting the key to work, or some other way to deal with this latest of grouping nightmares in xslt 1.0?

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.