Re: [xsl] Sorry No Text : Grouping and Sorting Problem

Subject: Re: [xsl] Sorry No Text : Grouping and Sorting Problem
From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
Date: Mon, 29 Jul 2002 15:50:30 -0400
At 2002-07-29 12:29 -0700, Kuhns Matt wrote:
My XML Sheet looks like this:
...
My XSL Looks like this:

<xsl:key name="GroupDesc" match="SM" use="@Grp"/>
...
I want my results to be grouped my Scripts, then by
the Grp attribute, but I keep getting
All the messages under the first script.

I find doing multi-level grouping is far easier using variables instead of using keys if you don't need a node set at the end of your grouping.


Please find a running example below where I store in variables only those in the scope of being grouped, and then use generate-id() with that variable to find the unique members.

I didn't

I hope this helps.

................... Ken

T:\ftemp>type matt.xml
<File>
<Script>
  <TestScript Name="Script1">
    <ScriptMessages>
      <SM ET="0" Grp="1">Script1 Error #1</SM>
      <SM ET="0" Grp="0">Script1 Error #0</SM>
      <SM ET="0" Grp="1">Script1 Error #1</SM>
      <SM ET="0" Grp="2">Script1 Error #2</SM>
      <SM ET="0" Grp="0">Script1 Error #0</SM>
      <SM ET="0" Grp="2">Script1 Error #2</SM>
      <SM ET="0" Grp="1">Script1 Error #1</SM>
      <SM ET="0" Grp="1">Script1 Error #1</SM>
      <SM ET="0" Grp="0">Script1 Error #0</SM>
      <SM ET="0" Grp="1">Script1 Error #1</SM>
      <SM ET="0" Grp="1">Script1 Error #1</SM>
    </ScriptMessages>
  </TestScript>
  <TestScript Name="Script2">
    <ScriptMessages>
      <SM ET="0" Grp="1">Script2 Error #1</SM>
      <SM ET="0" Grp="0">Script2 Error #0</SM>
      <SM ET="0" Grp="1">Script2 Error #1</SM>
      <SM ET="0" Grp="2">Script2 Error #2</SM>
      <SM ET="0" Grp="0">Script2 Error #0</SM>
      <SM ET="0" Grp="2">Script2 Error #2</SM>
      <SM ET="0" Grp="1">Script2 Error #1</SM>
      <SM ET="0" Grp="1">Script2 Error #1</SM>
      <SM ET="0" Grp="0">Script2 Error #0</SM>
      <SM ET="0" Grp="1">Script2 Error #1</SM>
      <SM ET="0" Grp="1">Script2 Error #1</SM>
    </ScriptMessages>
  </TestScript>
  <TestScript Name="Script3">
    <ScriptMessages>
      <SM ET="0" Grp="1">Script3 Error #1</SM>
      <SM ET="0" Grp="0">Script3 Error #0</SM>
      <SM ET="0" Grp="1">Script3 Error #1</SM>
      <SM ET="0" Grp="2">Script3 Error #2</SM>
      <SM ET="0" Grp="0">Script3 Error #0</SM>
      <SM ET="0" Grp="2">Script3 Error #2</SM>
      <SM ET="0" Grp="1">Script3 Error #1</SM>
      <SM ET="0" Grp="1">Script3 Error #1</SM>
      <SM ET="0" Grp="0">Script3 Error #0</SM>
      <SM ET="0" Grp="1">Script3 Error #1</SM>
      <SM ET="0" Grp="1">Script3 Error #1</SM>
    </ScriptMessages>
  </TestScript>
</Script>
</File>

T:\ftemp>type matt.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                version="1.0">

<xsl:output method="text"/>

<xsl:template match="/">
<xsl:variable name="scripts" select="/File/Script/TestScript"/>
<xsl:for-each select="$scripts">
<xsl:sort select="@name"/>
<xsl:if test="generate-id(.)=generate-id($scripts[@Name=current()/@Name])">
Script <xsl:value-of select="@Name"/>:
<xsl:text/>
<xsl:variable name="groups"
select="$scripts[@Name=current()/@Name]/ScriptMessages/SM"/>
<xsl:for-each select="$groups">
<xsl:sort select="@Grp"/>
<xsl:if test="generate-id(.)=generate-id($groups[@Grp=current()/@Grp])">
Group <xsl:value-of select="@Grp"/>:
<xsl:text/>
<xsl:for-each select="$groups[@Grp=current()/@Grp]">
<xsl:value-of select="."/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</xsl:template>


</xsl:stylesheet>

T:\ftemp>xt matt.xml matt.xsl matt.txt

T:\ftemp>type matt.txt

Script Script1:

Group 0:
Script1 Error #0
Script1 Error #0
Script1 Error #0

Group 1:
Script1 Error #1
Script1 Error #1
Script1 Error #1
Script1 Error #1
Script1 Error #1
Script1 Error #1

Group 2:
Script1 Error #2
Script1 Error #2

Script Script2:

Group 0:
Script2 Error #0
Script2 Error #0
Script2 Error #0

Group 1:
Script2 Error #1
Script2 Error #1
Script2 Error #1
Script2 Error #1
Script2 Error #1
Script2 Error #1

Group 2:
Script2 Error #2
Script2 Error #2

Script Script3:

Group 0:
Script3 Error #0
Script3 Error #0
Script3 Error #0

Group 1:
Script3 Error #1
Script3 Error #1
Script3 Error #1
Script3 Error #1
Script3 Error #1
Script3 Error #1

Group 2:
Script3 Error #2
Script3 Error #2

T:\ftemp>rem Done!


-- Upcoming hands-on in-depth 3-days XSLT/XPath and/or 2-days XSL-FO: - North America: Sep 30-Oct 4,2002 - Japan: Oct 7-Oct 11,2002

G. Ken Holman                 mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0  +1(613)489-0999 (Fax:-0995)
ISBN 0-13-065196-6                       Definitive XSLT and XPath
ISBN 1-894049-08-X   Practical Transformation Using XSLT and XPath
ISBN 1-894049-07-1                Practical Formatting Using XSLFO
XSL/XML/DSSSL/SGML/OmniMark services, books (electronic, printed),
articles, training (instructor-live,Internet-live,web/CD,licensed)
Next public training:           2002-08-05,26,27,09-30,10-03,07,10


XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list



Current Thread