• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

XSLT Für Trees

Specialist0815

New member
Hallo zusammen.

Ich sitz derzeit an einem Problem und weiß nicht so ganz weiter.


Ich weiß dass ich eine XML Source habe die Baumförmig aufgebaut ist, die im wesentlichen aus 2 Dingen besteht.

<Tree>

und <Treeelement>

diese können verschachtelt vorkommen, also beispielsweise

<Tree>
<Treeelement/>
<Treeelement/>
</tree>
<Tree>
<Treeelement/>
<Tree>
<Treeelement/>
<Treeelement/>
<Treeelement/>
</Tree>
<Treeelement/>
<Treeelement/>
</Tree>

Dass ich nun ein Rekursiv Arbeitendes Style Sheet brauche ist mir auch klar, nur irgendwie will das nicht so recht werkeln wie ich mir das vorstelle...


Derzeit sieht es so aus:
<xsl:template match="Root">
<ul>
<xsl:apply-templates select="Tree"/>
</ul>
</xsl:template>

<xsl:template match="Tree">
<xsl:if test="(count(Tree)=0)">
<b>
<xsl:variable name="test" select="count(Tree)"/>
<xsl:value-of select="$test"/>
</b>
<xsl:apply-templates select="Tree_Item"/>
</xsl:if>
<xsl:eek:therwise>
<li><xsl:value-of select="@id"/><ul><xsl:apply-templates select="Tree"/></ul></li>
</xsl:eek:therwise>
</xsl:template>

<xsl:template match="Tree_Item">
<li>test + <xsl:value-of select="@id"/></li>
</xsl:template>

Wenn jemand meinen Denkfehler findet wäre ich sehr dankbar, derzeit sieht mein Output noch nicht so aus wie er soll (will eigentlich nur die XML Struktur in einer Liste darstellen, die Funktionen einzubetten ist ja das kleinere Problem)
 
ich hab zwar noch nicht viel mit XSLT gemacht, aber müßte es nicht Treeelement statt Tree_Item heißen?

Außerdem könnte es sein, daß die if Anweisung überflüssig wird, wenn Du einfach apply_templates mit select="." machst. Allerdings wirst Du dann eine Schliefe über alle Childs des Tree Nodes machen müssen.
 
hups da hab ich das XML aus dem Kopf anders geschrieben als das XSLT aus dem Code kopiert.


Was das mit den Schleifen angeht, das passt irgendwie nicht zu XSLT, die rekursive Lösung ist denke ich schon geschickter, zumal die auch wesentlich schneller sein dürfte. So eine richtig gute deutsche Doku zu XSLT gibt es ja auch nicht :(
 
Schleife und Rekursion schliessen sich nicht aus, ich meinte vielmehr, daß Du die direkten Childs eines Tree Nodes durchgehen mußt und dort jeweils apply_templates machst, was bei einem geschachtelten Tree zu einem rekursiven Aufruf, bei einem Item nur zum ausgeben des entsprechenden Textes führt....
 
wisst ihr was ich an XSLT hasse? Je schwieriger das Problem aussieht, desto simpler die Lösung...

<xsl:template match="/">
<xsl:apply-templates select="root"/>
</xsl:template>

<xsl:template match="root">
<Ul>
<xsl:apply-templates select="Tree"/>
</Ul>
</xsl:template>

<xsl:template match="Tree">
<nobr>
<li>
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>Treestart <xsl:value-of select="@text"/><UL><xsl:apply-templates select="Tree"/><xsl:apply-templates select="Tree_Item"/></UL></li>
</nobr>
</xsl:template>

<xsl:template match="Tree_Item">
<li>test</li>
</xsl:template>

und alle meine Probleme sind gelöst, jetzt bekomm ich die Struktur wie ich sie will, jetzt muss ich nur noch den ganzen Kleinkram einfügen ;) wie Styles, JS Funktionen, etc...
 
Zurück
Oben