Altova Mailing List Archives


Re: [xsl] XSLT grouping(?) issue

From: Wendell Piez <wapiez@------------.--->
To: xsl-list@-----.------------.---
Date: 12/22/2008 5:38:00 PM
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@m...
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
======================================================================


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe@l...>
--~--

Disclaimer

These Archives are provided for informational purposes only and have been generated directly from the Altova mailing list archive system and are comprised of the lists set forth on www.altova.com/list/index.html. Therefore, Altova does not warrant or guarantee the accuracy, reliability, completeness, usefulness, non-infringement of intellectual property rights, or quality of any content on the Altova Mailing List Archive(s), regardless of who originates that content. You expressly understand and agree that you bear all risks associated with using or relying on that content. Altova will not be liable or responsible in any way for any content posted including, but not limited to, any errors or omissions in content, or for any losses or damage of any kind incurred as a result of the use of or reliance on any content. This disclaimer and limitation on liability is in addition to the disclaimers and limitations contained in the Website Terms of Use and elsewhere on the site.