Re: [xsl] Multi-level grouping across multiple input files question.

Subject: Re: [xsl] Multi-level grouping across multiple input files question.
From: David Carlisle <davidc@xxxxxxxxx>
Date: Wed, 13 Oct 2004 12:19:15 +0100
> then by the month of <actual>,
 <actual>5/7/2004 8:34:00 AM </actual>

horrible format you have for dates:-) (single digits so not fixed length
strings) (also I can't tell if you are using the inverted "amercian"
order, so is that 5 or 7 you want? (apply suitable combinations of
substring-before or substring-after below, then use format-number to
force it to two digits.

Then you want something like

<xsl:variable name="input" select="
  document('april.xml') |
  document('may.xml') |
  document('june.xml') |
  document('july.xml') |
  document('august.xml') |
  document('september.xml')
"/>

<xsl:key name="a" match="claim" use="vendorname"/>
<xsl:key name="b" match="claim"
use="concat(vendorname,':',format-number(substring-before...))"/>
<xsl:key name="c" match="claim"
use="concat(vendorname,':',format-number(substring-before...),':',loadnum)"/>

<!--
that sets up keys for all three levels, the code below just does the
first level group (this would be a lot easier in xslt2 draft)
-->

<xsl:for-each select="$input/claims/claim">

<!--
process all claims
-->

 <xsl:variable name="ids">
 <xsl:for-each select="$input">
  <xsl:value-of select="generate-id(key('a',vendorname)")
  <xsl:text>:</xsl:text>
 </xsl:for-each>
 </xsl:variable>

<!--
That has the id of the first claim in each doc that has this vendorname
-->


 <xsl:if test="generate-id(.)=substring-before($ids,':')">

<!--
 if this is true then we are on the first claim with this vendor in the
 collection, so proceess the group of all claims with this vendor,
 otherwise do nothing.
 -->

 heading: <xsl:value-of select="vendorname"/>
<!--
make a heading for the group
-->

  <xsl:for-each select="$inputs">
    <xsl:apply-templates  select="key('a',vendorname)"/>
  </xsl:for-each>

<!--
 apply templates to all claims in this group (this will need to do
 essentially the same again but with keys b and c to do the subgroups)
-->

 </xsl:if>
</xsl:for-each>

<!-- finish up -->


David

________________________________________________________________________
This e-mail has been scanned for all viruses by Star. The
service is powered by MessageLabs. For more information on a proactive
anti-virus service working around the clock, around the globe, visit:
http://www.star.net.uk
________________________________________________________________________

Current Thread