Subject: RE: 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: 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.
|