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

Re: [xsl] for-each-group - only get elements in each group


Subject: Re: [xsl] for-each-group - only get elements in each group
From: "G. Ken Holman g.ken.holman@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 20 Jan 2016 17:56:16 -0000

At 2016-01-20 17:35 +0000, Rick Quatro rick@xxxxxxxxxxxxxx wrote:
Hi, I have this XML:
...
I want to group on each unique <Category> element and then only include the
<Case> elements for each <Category>. Here is what I need:
...

My take on it is below. As I see it, your focus is on the cases and what categorizes them is the closest preceding sibling. This would allow for an arbitrary number of case elements after each heading.


I hope this is helpful.

. . . . . . Ken

t:\ftemp>type rick.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Cases>
  <Story>
    <Category>Category1</Category>
    <Case>Case1</Case>
    <Category>Category1</Category>
    <Case>Case2</Case>
    <Category>Category1</Category>
    <Case>Case3</Case>
    <Category>Category1</Category>
    <Case>Case4</Case>
    <Category>Category2</Category>
    <Case>Case5</Case>
    <Category>Category2</Category>
    <Case>Case6</Case>
    <Category>Category2</Category>
    <Case>Case7</Case>
    <Category>Category2</Category>
    <Case>Case8</Case>
  </Story>
</Cases>
t:\ftemp>xslt2 rick.xml rick.xsl
<?xml version="1.0" encoding="UTF-8"?>
<cases>
   <category>Category1</category>
   <Case>Case1</Case>
   <Case>Case2</Case>
   <Case>Case3</Case>
   <Case>Case4</Case>
   <category>Category2</category>
   <Case>Case5</Case>
   <Case>Case6</Case>
   <Case>Case7</Case>
   <Case>Case8</Case>
</cases>

t:\ftemp>type rick.xsl
<?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="2.0">

<xsl:output indent="yes"/>

<xsl:template match="/">
  <cases>
    <xsl:for-each-group select="Cases/Story/Case"
                        group-by="preceding-sibling::Category[1]">
      <category>
        <xsl:apply-templates select="preceding-sibling::Category[1]/node()"/>
      </category>
      <xsl:copy-of select="current-group()"/>
    </xsl:for-each-group>
  </cases>
</xsl:template>

</xsl:stylesheet>
t:\ftemp>

--
Check our site for free XML, XSLT, XSL-FO and UBL developer resources |
Free 5-hour lecture:  http://www.CraneSoftwrights.com/links/video.htm |
Crane Softwrights Ltd.             http://www.CraneSoftwrights.com/s/ |
G. Ken Holman                    mailto:gkholman@xxxxxxxxxxxxxxxxxxxx |
Google+ profile:       http://plus.google.com/+GKenHolman-Crane/about |
Legal business disclaimers:     http://www.CraneSoftwrights.com/legal |


--- This email has been checked for viruses by Avast antivirus software. https://www.avast.com/antivirus


Current Thread
Keywords