Re: [xsl] XSLT grouping(?) issue

Subject: Re: [xsl] XSLT grouping(?) issue
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Mon, 22 Dec 2008 12:16:22 -0500
Fredde,

You've given me hope by saying it is solvable. Will this new XML-fragment allow you to show me how? That would basically save christmas for me...

That's irresistible.


As Mike suggested, this problem is ready-made for XSLT 2.0 group-starting-with.

An XSLT 1.0 solution is not complicated, but it is subtle:

<xsl:key name="item-by-group"
 match="*[Id]"
 use="generate-id(
   (preceding-sibling::StartOrderGroup |
    preceding-sibling::EndOrderGroup)[last()])"/>

<xsl:template match="Orders">
  <xsl:apply-templates select="StartOrderGroup"/>
</xsl:template>

<xsl:template match="StartOrderGroup">
<xsl:text>&#xA;&#xA;Order&#xA;-----</xsl:text>
<xsl:apply-templates select="key('item-by-group',generate-id())" mode="out"/>
</xsl:template>


<xsl:template match="Car | Bus | Truck" mode="out">
  <xsl:text>&#xA;</xsl:text>
  <xsl:value-of select="local-name()"/>
  <xsl:text> - </xsl:text>
  <xsl:value-of select="Id"/>
</xsl:template>

<xsl:template match="StartOrderGroup | EndOrderGroup" mode="out"/>

Notice that this ignores the Id elements on the StartOrderGroup (the system generated ID is more robust for these purposes), and ignores EndOrderGroup elements altogether. The trickiest thing is the way the key matches elements to an EndOrderGroup when they fall after a group ends but before the next group starts, so they can be skipped.

Cheers,
Wendell

Order
-----
Car - 2
Car - 3
Bus - 4

Order
-----
Truck - 9

At 05:37 AM 12/22/2008, you wrote:
> The problem is solvable with XSLT, provided your input XML
> is well
> formed. But your input is not a valid XML document.
>
> for e.g., <Id=1/> is not a valid XML fragment, and
> XML parser
> complains about it.

My mistake, I apologize. When I simplified my XML I made it more bad formed than it really is...

<Orders>
  <StartOrderGroup>
    <Id>1</Id>
  </StartOrderGroup>
  <Car>
    <Id>2</Id>
  </Car>
  <Car>
    <Id>3</Id>
  </Car>
  <Bus>
    <Id>4</Id>
  </Bus>
  <EndOrderGroup>
    <Id>5</Id>
  </EndOrderGroup>
  <Car>
    <Id>6</Id>
  </Car>
  <Truck>
    <Id>7</Id>
  </Truck>
  <StartOrderGroup>
    <Id>8</Id>
  </StartOrderGroup>
  <Truck>
    <Id>9</Id>
  </Truck>
  <EndOrderGroup>
    <Id>10</Id>
  </EndOrderGroup>
</Orders>


======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================

Current Thread