xsl-list
[Top] [All Lists]

RE: Yet another grouping question

2004-09-16 02:04:41

An XSLT 2.0 solution:

<xsl:template match="/">
  <index>
    <xsl:for-each-group select="indexRoot/indexItem"
group-by="@primary">
      <primary name="{(_at_)primary}">
          <xsl:for-each select="current-group()[(_at_)secondary]">
            <secondary name="{(_at_)secondary}"/>
          </xsl:for-each>
      </primary>
    </xsl:for-each-group>
  </index>
</xsl:template>

No keys or generate-id() in sight :)

cheers
andrew

So I've gone through the 'XSLT Questions and Answers' and 
Jeni's site and it is still not clear to me why my Muenchien 
grouping isn't working. Specificaly, the step related to 
limiting responses to the first in the group.

Imagine I have an XML file like this:

<indexRoot>
  <indexItem primary="ide" secondary="object repository"/>
  <indexItem primary="ide" secondary="Project Manager"/>
  <indexItem primary="ide" secondary="Code Editor"/>
  <indexItem primary="projects" secondary="type of"/>
  <indexItem primary="projects" secondary="additional projects"/>
  <indexItem primary="unmanaged code"/>
</indexRoot>


I would like to group it something like:


      <index>
           <primary name="ide">
                 <secondary name="object repository"/>
                 <secondary name="Project Manager"/>
                 <secondary name="Code Editor"/>
           </primary>
           <primary name="projects">
                 <secondary name="type of"/>
                 <secondary name="additional projects"/>
           </primary>
           <primary name="unmanaged code"/>
      </index>

I have defined a key like this:

 <xsl:key name="index-by-primary" match="indexItem" 
use="@secondary" />

When I try to get the first with something like:

 <xsl:for-each select="indexItem[count(. | key('index-by-primary',
@primary)[1]) = 1]">
    <xsl:message>
       <xsl:value-of select="@primary"/>, <xsl:value-of 
select="@secondary"/>
    </xsl:message>
  </xsl:for-each>

I get a message for every indexItem, not just the first of 
each unique @secondary.


<Prev in Thread] Current Thread [Next in Thread>