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

current-group()[1] within xsl:for-each-group

Subject: current-group()[1] within xsl:for-each-group
From: Kevin Rodgers <kevin.rodgers@xxxxxxx>
Date: Tue, 1 Mar 2005 19:15:29 -0700
xsl current group
This is a much harder problem than my previous question :-/

I've got this in a template:

      <xsl:for-each-group select="mb3e:document" group-by="mb3e:fam_id">
        <xsl:sort select="mb3e:prim_sort_key"/>
        <xsl:variable name="first-structured-number"
                      select="esd:structured-number(current-group()[1])"/>
        <xsl:apply-templates mode="mil" select="current-group()">
          <xsl:with-param name="family-structured-number"
                          select="$first-structured-number"/>
          <xsl:sort select="mb3e:date_list/mb3e:date[@type='PUBL']"
                    order="descending"/>
        </xsl:apply-templates>
      </xsl:for-each-group>

The idea is to process the mb3e:document elements in groups, which are
defined as having mb3e:fam_id subelements with the same content.  And
within each group, to process them in reverse order of their publication
date (in YYYY-MM-DD format), in each case using the result of calling
the esd:structured-number function on the most recent document.  (The
groups themselves are processed according to the mb3e:prim_sort_key
order.)

The esd:structured-number function is slow, so I only want to call it
once per group.  Actually, the template that is applied within the
xsl:for-each-group instruction has to call it for each mb3e:document
element, but I want to avoid calling it more than once for any of those
elements (including the first, i.e. most recent):

  <xsl:variable name="structured-number"
                select="if (position() = 1)
                        then $family-structured-number
                        else esd:structured-number(.)"/>

I think this works most of the time, but sometimes the
family-structured-number parameter value (i.e. $first-structured-number)
is not the value that would be returned if the esd:structured-number
function were called on the most recent mb3e:document element in the
group.  For example, in once case it was the 7th most recent of a group
of 58.

Is there something inherently wrong with the code above?  I know from
the output that the mb3e:document elements are grouped and sorted as I
intend.  The output also indicates that the postition() = 1 test in the
mb3e:document template is working.  But for some reason the
current-group()[1] expression within the xsl:for-each-group instruction
isn't always returning the element I expect.

Just in case, here's an abbreviated example showing all the referenced
elements and attributes above:

<document>
<prim_sort_key>MIL PRF 0000001</prim_sort_key>
<date_list>
<date type="PUBL">2003-06-11</date>
<date type="PUBL_MOD">2003-06-17</date>
<date type="IHS_MOD">2003-07-22</date>
</date_list>
<fam_id>AOUBEAAAAAAAAAAA</fam_id>
</document>

Thanks,
-- 
Kevin Rodgers

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.