Subject: Re: [xsl] XPath and recursion From: Dimitre Novatchev <dnovatchev@xxxxxxxxx> Date: Thu, 23 Oct 2003 00:52:54 -0700 (PDT) |
> I've got an xml-file, something like this: > > <?xml version="1.0" encoding="UTF-8"?> > <document> > <node value1="DB Objects"> > <node value1="Andreas"> > <node value1="Peter"> > <node value1="Kempten"/> > <node value1="Ulperting"/> > </node> > <node value1="Muahhh"/> > <node value1="Christoph"> > <node value1="Ulperting"/> > <node value1="FrankyBoy"> > <node value1="Munich"/> > </node> > </node> > </node> > <node value1="Christoph"> > <node value1="Munich"/> > <node value1="FrankyBoy"> > <node value1="Kempten"/> > </node> > </node> > <node value1="Frank"/> > </node> > <node value1="Tables"> > <node value1="Andreas"> > <node value1="Peter"> > <node value1="Munich"/> > <node value1="Ulperting"/> > </node> > </node> > ... > </node> > </document> > > And I want to get an output like this after the xsl transformation: > > aux1 = insFld(foldersTree, gFld("DB-Objects")) > aux2 = insFld(aux1, gFld("Andreas",)) > aux3 = insFld(aux2, gFld("Peter")) > aux4 = insFld(aux3, gFld("Kempten")) > aux4 = insFld(aux3, gFld("Ulperting")) > aux3 = insFld(aux2, gFld("Muahhh")) > aux3 = insFld(aux2, gFld("Christoph")) > aux4 = insFld(aux3, gFld("FrankyBoy")) > aux5 = insFld(aux4, gFld("Munich")) > aux5 = insFld(aux4, gFld("FrankyBoy")) > aux6 = insFld(aux5, gFld > ("Kempten")) > aux6 = insFld(aux5, gFld > ("Kempten")) > aux2 = insFld(aux1, gFld("Christoph")) > aux2 = insFld(aux1, gFld("Frank")) > aux3 = insFld(aux2, gFld("Peter")) > aux4 = insFld(aux3, gFld("Ulperting")) > aux3 = insFld(aux2, gFld("Muahhh")) > aux3 = insFld(aux2, gFld("Christoph")) > aux4 = insFld(aux3, gFld("Ulperting")) > aux4 = insFld(aux3, gFld("FrankyBoy")) > aux5 = insFld(aux4, gFld("Munich")) > aux1 = insFld(foldersTree, gFld("Tables")) > aux2 = insFld(aux1, gFld("Andreas",)) > aux3 = insFld(aux2, gFld("Peter")) > aux4 = insFld(aux3, gFld("Kempten")) > aux3 = insFld(aux2, gFld("Christoph")) > aux4 = insFld(aux3, gFld("Munich")) > aux4 = insFld(aux3, gFld("Ulperting")) > > The idea behind that: > if /document has at least a child, write: > aux1 = insFld(foldersTreeview, gFld( "<xsl:value-of > select="@value1"/> ")); > if the child got at least another child,write: > aux2 = insFld(aux1, gFld("<xsl:value-of select="@value1"/> "); > if the child of the child got at least another child,write: > aux3 = insFld(aux2, gFld("<xsl:value-of select="@value1"/> "); > and so on.... > > I tried to solve this problem for a long time now, but falways failed. > Also the numbering of "aux", the deeper i get into the node-tree, is > impossibly for me. Have no clue how I would do that. This transformation: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:variable name="vQ">"</xsl:variable> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template> <xsl:template match="node"> <xsl:variable name="vDepth" select="count(ancestor::node) + 1"/> <xsl:value-of select="concat('aux', $vDepth, ' = insFld(')"/> <xsl:choose> <xsl:when test="$vDepth = 1">foldersTree</xsl:when> <xsl:otherwise> <xsl:value-of select="concat('aux', $vDepth - 1)"/> </xsl:otherwise> </xsl:choose> <xsl:value-of select="concat(', gFld(', $vQ, @value1, $vQ, '))')"/> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet> when applied on your source.xml: <document> <node value1="DB Objects"> <node value1="Andreas"> <node value1="Peter"> <node value1="Kempten"/> <node value1="Ulperting"/> </node> <node value1="Muahhh"/> <node value1="Christoph"> <node value1="Ulperting"/> <node value1="FrankyBoy"> <node value1="Munich"/> </node> </node> </node> <node value1="Christoph"> <node value1="Munich"/> <node value1="FrankyBoy"> <node value1="Kempten"/> </node> </node> <node value1="Frank"/> </node> <node value1="Tables"> <node value1="Andreas"> <node value1="Peter"> <node value1="Munich"/> <node value1="Ulperting"/> </node> </node> </node> </document> produces the wanted result: aux1 = insFld(foldersTree, gFld("DB Objects")) aux2 = insFld(aux1, gFld("Andreas")) aux3 = insFld(aux2, gFld("Peter")) aux4 = insFld(aux3, gFld("Kempten")) aux4 = insFld(aux3, gFld("Ulperting")) aux3 = insFld(aux2, gFld("Muahhh")) aux3 = insFld(aux2, gFld("Christoph")) aux4 = insFld(aux3, gFld("Ulperting")) aux4 = insFld(aux3, gFld("FrankyBoy")) aux5 = insFld(aux4, gFld("Munich")) aux2 = insFld(aux1, gFld("Christoph")) aux3 = insFld(aux2, gFld("Munich")) aux3 = insFld(aux2, gFld("FrankyBoy")) aux4 = insFld(aux3, gFld("Kempten")) aux2 = insFld(aux1, gFld("Frank")) aux1 = insFld(foldersTree, gFld("Tables")) aux2 = insFld(aux1, gFld("Andreas")) aux3 = insFld(aux2, gFld("Peter")) aux4 = insFld(aux3, gFld("Munich")) aux4 = insFld(aux3, gFld("Ulperting")) ===== Cheers, Dimitre Novatchev. http://fxsl.sourceforge.net/ -- the home of FXSL __________________________________ Do you Yahoo!? The New Yahoo! Shopping - with improved product search http://shopping.yahoo.com XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] XPath and recursion, M. David Peterson | Thread | Re: [xsl] XPath and recursion, Jonny Pony |
RE: [xsl] XPath and recursion, Michael Kay | Date | Re: [xsl] escaping inverted commas, David Elsmore |
Month |