xsl-list
[Top] [All Lists]

Re: XPath and recursion

2003-10-23 00:52:54
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



<Prev in Thread] Current Thread [Next in Thread>