Subject: [xsl] Re: getting all nodes from a certain level in the xml hierarchy From: Dimitre Novatchev <dnovatchev@xxxxxxxxx> Date: Fri, 27 Sep 2002 03:45:57 -0700 (PDT) |
--- "Peter Menzel" <mai00bfy at studserv dot uni-leipzig dot de> wrote: > Hallo > > my problem is the following: > my XML document maps the structure of a folder tree (just like the > unix > file > hierarchy) but without files, e.g.: > > <Folder NAME="/"> > <Folder NAME="a"/> > <Folder NAME="b"> > <Folder NAME="ba"/> > <Folder NAME="bb"/> > </Folder> > ... > <Folder NAME="z"> > <Folder NAME="za"> > ... > <Folder NAME="very deep folder"/> > ... > </Folder> > </Folder > </Folder> > > The real folder NAMEs are like real folder names, and have no > specific > length or content. > The depth of the deepest node is unknown. > > I need to access all nodes that have the same depth. > So first i need root, then all direct childs of root, then all nodes > that > are two levels under root, because i want tu put them in a table > like: > > level | 0 | 1 | 2 ... x > ------+--+----+----- --------------- > | / | a | ba very deep folder > | | b | bb > ... > | | z | za > > first I started to try <xsl:for-each select="//Folder"> and then > <xsl:for-each select="//Folder/Folder"> but because I do not know the > depth > of the tree, this won't work.. > > Can anybody help me, what is the direction i should go? > I don't think there is an easy way to use XPath for adressing nodes > on > the > same level? > > Nice greetings, Peter Here's a simple solution using the Muenchian method for grouping: source xml (provided by you): ---------------------------- <Folder NAME="/"> <Folder NAME="a"/> <Folder NAME="b"> <Folder NAME="ba"/> <Folder NAME="bb"/> </Folder> <Folder NAME="z"> <Folder NAME="za"> <Folder NAME="very deep folder"/> </Folder> </Folder> </Folder> stylesheet: ---------- <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:key name="kDepth" match="Folder" use="count(ancestor::*)" /> <xsl:template match="/"> <xsl:for-each select="//Folder [ generate-id() = generate-id(key('kDepth', count(ancestor::*) )[1] ) ]"> <xsl:value-of select="concat('Level ', count(ancestor::*), ': ' )"/> <xsl:for-each select="key('kDepth',count(ancestor::*))"> <xsl:value-of select="concat(@NAME, '; ')"/> </xsl:for-each> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> Result: ------ Level 0: /; Level 1: a; b; z; Level 2: ba; bb; za; Level 3: very deep folder; Hope this helped. ===== Cheers, Dimitre Novatchev. http://fxsl.sourceforge.net/ -- the home of FXSL __________________________________________________ Do you Yahoo!? New DSL Internet Access from SBC & Yahoo! http://sbc.yahoo.com XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] getting all nodes from a , James Fuller | Thread | AW: [xsl] Re: getting all nodes fro, Peter Menzel |
RE: [xsl] amp, Jarno . Elovirta | Date | RE: [xsl] amp, Stevenson Ngila |
Month |