xsl-list
[Top] [All Lists]

Re: [xsl] XSLT grouping(?) issue

2008-12-23 16:52:36
Thanks Wendell! :) Merry christmas to you!


--- Den mån 2008-12-22 skrev Wendell Piez <wapiez(_at_)mulberrytech(_dot_)com>:

Från: Wendell Piez <wapiez(_at_)mulberrytech(_dot_)com>
Ämne: Re: [xsl] XSLT grouping(?) issue
Till: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Datum: måndag 22 december 2008 18.16
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(_at_)mulberrytech(_dot_)com
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(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


      __________________________________________________________
Går det långsamt? Skaffa dig en snabbare bredbandsuppkoppling. 
Sök och jämför priser hos Kelkoo.
http://www.kelkoo.se/c-100015813-bredband.html?partnerId=96914325

--~------------------------------------------------------------------
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(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>