| Subject: Re: [xsl] Transform flat structure into hierarchy From: Peter Davis <pdavis152@xxxxxxxxx> Date: Mon, 11 Mar 2002 15:47:45 -0800 | 
I'd do a recursive template that selects only those PublicationElements that 
are children of the current element.  I don't think there is any need to use 
the Muenchian method.
<!-- this is untested -->
<xsl:template match="Publication">
  <xsl:apply-templates select="PublicationElements[ParentIndex = -1]"/>
</xsl:template>
<!-- copy all nodes that don't have their own template -->
<xsl:template match="node() | @*">
  <xsl:copy>
    <xsl:apply-templates select="node() | @*"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="PublicationElements">
  <!-- copy the <PublicationElements> and all the children, and also copy 
<PublicationElements>s that have the current node set as the parent -->
  <xsl:copy>
    <xsl:apply-templates select="node() | @*"/>
    <xsl:apply-templates
      select="../PublicationElements[ParentIndex = current()/SelfIndex]"/>
  </xsl:copy>
</xsl:template>
If you think using keys would be faster, then you could also add:
<xsl:key name="children" match="PublicationElements" use="ParentIndex"/>
and replace the apply-templates with:
<xsl:apply-templates select="key('children', -1)"/>
and
<xsl:apply-templates select="key('children', SelfIndex)"/>
Either way, it's not really a grouping problem.  It's just a problem of 
filtering out the unwanted elements at each level (those that have 
ParentIndex != current()/SelfIndex), copying the current element, and then 
repeating the process for the next level down.
On Monday 11 March 2002 07:13, Scherpenzeel, Wim wrote:
> I have an XML file (see below) that has a 'flat' structure and I need to
> transform it into an hierarchical structure (see below).
>
> I am trying my best with the Muenchian method etc, but I cannot get it
> quite right.
> Anybody out there want to give this one a try?
>
> Thanks
> Wim
>
> --------------------
> Input file:
> --------------------
> <Publication>
>   <PublicationElements>
>     <ParentIndex>-1</ParentIndex>
>     <SelfIndex>0</SelfIndex>
>     <LabelTypeName>Volgorde</LabelTypeName>
>     <LabelName>Folderflap</LabelName>
>     <ElementText>
>     </ElementText>
>   </PublicationElements>
>   <PublicationElements>
>     <ParentIndex>0</ParentIndex>
>     <SelfIndex>1</SelfIndex>
>     <LabelTypeName>Volgorde</LabelTypeName>
>     <LabelName>frontpage</LabelName>
>     <ElementText>
>     </ElementText>
>   </PublicationElements>
>   <PublicationElements>
>     <ParentIndex>1</ParentIndex>
>     <SelfIndex>2</SelfIndex>
>     <LabelTypeName>Volgorde</LabelTypeName>
>     <LabelName>headerbox</LabelName>
>     <ElementText>
>     </ElementText>
>     <Functions>Pre#F#Box</Functions>
>   </PublicationElements>
-- 
Peter Davis
Change the Social Contract?  BWAHAHAHAHAHAHAHAHAHAHAHA.
	-- Branden Robinson
 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
| Current Thread | 
|---|
| 
 | 
| <- Previous | Index | Next -> | 
|---|---|---|
| [xsl] Transform flat structure into, Scherpenzeel, Wim | Thread | RE: [xsl] Transform flat structure , McNally, David | 
| RE: [xsl] Date Comparison using ">=, Snow, Corey | Date | RE: [xsl] Date Comparison using ">=, Joshua . Kuswadi | 
| Month |