[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] Newbie Question: Convert "flat" hierarchy to nested hierarchy


Subject: RE: [xsl] Newbie Question: Convert "flat" hierarchy to nested hierarchy
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Sat, 14 Oct 2006 16:58:30 +0100

You'll find a paper that tackles this problem (using XSLT 2.0) at

http://www.idealliance.org/proceedings/xml04/papers/111/mhk-paper.html

The reverse transformation is much easier: you just process all the elements
in document order (//nest) and for each one compute its level number as
count(ancestor::*).

Michael Kay
http://www.saxonica.com/
 

> -----Original Message-----
> From: Watch-O-Matic [mailto:watchomatic@xxxxxxxxxxx] 
> Sent: 14 October 2006 16:09
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Newbie Question: Convert "flat" hierarchy to 
> nested hierarchy
> 
> I'm a newbie among newbies in XSLT, so I request your patience.
> 
> I'm interested in knowing if I can write an XSLT to transform a "flat"
> hierarchy, representing the hierarchy of a document, into a 
> true nested hierarchy. And do the reverse direction transformation.
> 
> To illustrate, here's an example of a "flat" hierarchy, where 
> the hierachical level of each {markupx} item is specified 
> using the 'lvl' attribute. (Each {markupx} item contains a 
> mix of marked-up
> content.)
> 
>    <flat lvl="1"> {markupA} </flat>
>    <flat lvl="2"> {markupB} </flat>
>    <flat lvl="2"> {markupC} </flat>
>    <flat lvl="1"> {markupD} </flat>
>    <flat lvl="2"> {markupE} </flat>
>    <flat lvl="2"> {markupF} </flat>
>    <flat lvl="3"> {markupG} </flat>
>    <flat lvl="4"> {markupH} </flat>
>    <flat lvl="4"> {markupI} </flat>
>    <flat lvl="3"> {markupJ} </flat>
>    <flat lvl="3"> {markupK} </flat>
>    <flat lvl="2"> {markupL} </flat>
>    <flat lvl="1"> {markupM} </flat>
> 
> 
> Here's what I'd like to transform it into, and back again:
> 
>    <nest> {markupA}
>       <nest> {markupB} </nest>
>       <nest> {markupC} </nest>
>    </nest>
>    <nest> {markupD}
>       <nest> {markupE} </nest>
>       <nest> {markupF}
>          <nest> {markupG}
>             <nest> {markupH} </nest>
>             <nest> {markupI} </nest>
>          </nest>
>          <nest> {markupJ} </nest>
>          <nest> {markupK} </nest>
>       </nest>
>       <nest> {markupL} </nest>
>    </nest>
>    <nest> {markupM} </nest>
> 
> 
> Assume also that there will be other shared attributes for 
> both <flat> and <nest> -- I've left them out in the above 
> markup examples to make it easier to visualize the problem.
> 
> 
> Are the two-way transformations doable in XSLT?
> 
> I humbly request the discussion focus on the feasibility of 
> the two-way transformation, and not on alternatives to the 
> markup models I'm working with. I don't have much say in the 
> matter since this task was dropped in my lap (and having to 
> come up to speed in XSLT.)
> 
> Thanks!
> 
> Mark
> --
>   Watch-O-Matic
>   watchomatic@xxxxxxxxxxx
> 
> --
> http://www.fastmail.fm - Same, same, but different.


Current Thread
Keywords