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>
|