[Home] [By Thread] [By Date] [Recent Entries]

Subject: Group by optimism
From: "rick@xxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 13 Feb 2026 17:27:39 -0000
Hi All,



I have a grouping task where I am producing an index.



I am grouping by all symbols versus each letter.



Within each letter, I am grouping by case name.



Within each case name, I am grouping by section.



I have it working, but curious if there is a way to optimize the code or
make it more readable. Thanks in advance.



Rick



<?xml version='1.0' encoding='UTF-8'?>
<data>
  <case>
    <caseName>Anderson</caseName>
    <caseNameSort>Anderson</caseNameSort>
    <sect>1.4:1</sect>
    <sectSort>000001.000004:000001</sectSort>
  </case>
  <case>
    <caseName>Anderson</caseName>
    <caseNameSort>Anderson</caseNameSort>
    <sect>1.2:1</sect>
    <sectSort>000001.000002:000001</sectSort>
  </case>
  <case>
    <caseName>Becker</caseName>
    <caseNameSort>Becker</caseNameSort>
    <sect>1.4:1</sect>
    <sectSort>000001.000004:000001</sectSort>
  </case>
  <case>
    <caseName>Carlson</caseName>
    <caseNameSort>Carlson</caseNameSort>
    <sect>1.4:1</sect>
    <sectSort>000001.000004:000001</sectSort>
  </case>
  <case>
    <caseName>Carlson</caseName>
    <caseNameSort>Carlson</caseNameSort>
    <sect>1.5:1</sect>
    <sectSort>000001.000004:000001</sectSort>
  </case>
  <case>
    <caseName>1884</caseName>
    <caseNameSort>1884</caseNameSort>
    <sect>2.5:1</sect>
    <sectSort>000002.000005:000001</sectSort>
  </case>
  <case>
    <caseName>1884</caseName>
    <caseNameSort>1884</caseNameSort>
    <sect>2.6:1</sect>
    <sectSort>000002.000005:000001</sectSort>
  </case>
  <case>
    <caseName>2884</caseName>
    <caseNameSort>2884</caseNameSort>
    <sect>3.5:1</sect>
    <sectSort>000002.000005:000001</sectSort>
  </case>
</data>



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="3.0"
    expand-text="yes">

    <xsl:output indent="yes"/>

    <xsl:template match="/data">
        <cases-index>
            <title>Cases Cited</title>
            <note/>
            <xsl:for-each-group select="child::case"
group-by="matches(upper-case(substring(normalize-space(caseName/.), 1,
1)),'^[A-Z]')">
                <xsl:sort select="./caseNameSort"/>
                    <xsl:choose>
                        <xsl:when test="current-grouping-key()=false()">
                            <cases-section>
                                <title>Symbols</title>
                                <xsl:for-each-group select="current-group()"
group-by="caseName">
                                    <entry>

<text>{normalize-space(current-grouping-key())}</text>
                                        <xsl:apply-templates
select="current-group()">
                                        <xsl:sort select="caseNameSort"/>
                                        <xsl:sort select="sectSort"/>
                                    </xsl:apply-templates>
                                    </entry>
                                </xsl:for-each-group>
                            </cases-section>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:for-each-group select="current-group()"
group-by="upper-case(substring(normalize-space(caseName/.), 1, 1))">
                                <cases-section>
                                    <title>{current-grouping-key()}</title>
                                    <xsl:for-each-group
select="current-group()" group-by="caseName">
                                        <entry>

<text>{normalize-space(current-grouping-key())}</text>
                                            <xsl:apply-templates
select="current-group()">
                                                <xsl:sort
select="caseNameSort"/>
                                                <xsl:sort
select="sectSort"/>
                                            </xsl:apply-templates>
                                        </entry>
                                    </xsl:for-each-group>
                                </cases-section>
                            </xsl:for-each-group>
                        </xsl:otherwise>
                    </xsl:choose>
            </xsl:for-each-group>
        </cases-index>
    </xsl:template>

    <xsl:template match="case">
        <xsl:apply-templates select="sect"/>
    </xsl:template>

    <xsl:template match="sect">
        <reference>{normalize-space(.)}</reference>
    </xsl:template>

</xsl:stylesheet>



<?xml version="1.0" encoding="UTF-8"?>
<cases-index>
   <title>Cases Cited</title>
   <note/>
   <cases-section>
      <title>Symbols</title>
      <entry>
         <text>1884</text>
         <reference>2.5:1</reference>
         <reference>2.6:1</reference>
      </entry>
      <entry>
         <text>2884</text>
         <reference>3.5:1</reference>
      </entry>
   </cases-section>
   <cases-section>
      <title>A</title>
      <entry>
         <text>Anderson</text>
         <reference>1.2:1</reference>
         <reference>1.4:1</reference>
      </entry>
   </cases-section>
   <cases-section>
      <title>B</title>
      <entry>
         <text>Becker</text>
         <reference>1.4:1</reference>
      </entry>
   </cases-section>
   <cases-section>
      <title>C</title>
      <entry>
         <text>Carlson</text>
         <reference>1.4:1</reference>
         <reference>1.5:1</reference>
      </entry>
   </cases-section>
</cases-index>

Current Thread
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member