Re: XPath and recursion
2003-10-23 06:29:04
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(_at_)yahoo(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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
|
|