[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

[xsl] Re: Sorting on two levels


Subject: [xsl] Re: Sorting on two levels
From: "Michele R Combs mrrothen@xxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 15 Apr 2015 13:50:39 -0000

The suggestion offered yesterday works great as far as the sorting, but I need
to do certain things to each item in a group as it's output, such as wrapping
each ID in an <a> element.  What I tried is shown below, but it results in
@href containing *all* the ids for the group.  How do I process each item in a
group separately?  Do I need to at some point just do <xsl:apply-templates
select=" current-group()"> and then rely on templates for primary, secondary,
etc.?  I did try that but couldn't seem to get it to work -- either I got no
output, or I got the entire group in a chunk.

<xsl:template name="create-index">
    <ul>
       <xsl:for-each-group select="//indexterm" group-by="primary">
          <xsl:sort select="current-grouping-key()"/>
          <li>
             <xsl:value-of select="current-grouping-key(),
if(not(current-group()/secondary)) then current-group()/@id else ()"
separator=", "/>
             <xsl:if test="current-group()/secondary">
                <ul>
                   <xsl:for-each-group select="current-group()"
group-by="secondary">
                      <xsl:sort select="current-grouping-key()"/>
                      <li>
                            <xsl:value-of select="current-grouping-key()"/>
                            <a>
                               <xsl:attribute name="href">
                                    <xsl:value-of
select="current-group()/@id"/>
                               </xsl:attribute>
                               <xsl:value-of select="current-group()/@id"
separator=", "/>
                           </a>
                      </li>
                   </xsl:for-each-group>
                </ul>
             </xsl:if>
          </li>
       </xsl:for-each-group>
    </ul>
</xsl:template>


Current Thread