Re: [xsl] XPath and recursion

Subject: Re: [xsl] XPath and recursion
From: "Jonny Pony" <jonnypony666@xxxxxxxxxxx>
Date: Thu, 23 Oct 2003 13:29:04 +0000
HIi,

this code works fine. Thank you very much. Only one minor problem. I use the result in an html page, as data for a javascript function so I cant use <xsl:output method="text"/>.

My desired output:
<script>
  aux1 = insFld(foldersTree, gFld("DB Objects"))
		aux2 = insFld(aux1, gFld("Andreas"))
			aux3 = insFld(aux2, gFld("Peter"))
				aux4 = insFld(aux3, gFld("Kempten"))
  ...
</script>

But without<xsl:output method="text"/>. it produces:
<script>
  <document>
     aux1 = insFld(foldersTree, gFld("DB Objects"))
		aux2 = insFld(aux1, gFld("Andreas"))
			aux3 = insFld(aux2, gFld("Peter"))
				aux4 = insFld(aux3, gFld("Kempten"))
     ...
  </document>
</script>

This is not usable with the <document> tags.

I call the templates like this right now:
<script>
  <xsl:apply-templates select="node()"/>
</script>

Is there a way of getting rid of the document-tags?

Thanks
Jonny



From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] XPath and recursion 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


_________________________________________________________________
FreeSMS und 666 Webcams abräumen mit dem MSN Messenger. http://messenger-mania.msn.de Jetzt mitmachen und gewinnen!



XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list



Current Thread