flashpixx Geschrieben 26. Februar 2013 Geschrieben 26. Februar 2013 Hallo, ich habe in XSLT 2.0 folgendes Template: <xsl:template name="item"> <xsl:text>?? test</xsl:text> </xsl:template> dazu noch passende Template Matches <xsl:template match="node1" <xsl:call-template name="item"/> </xsl:template> <xsl:template match="node2" <xsl:call-template name="item"/> </xsl:template> Dazu noch eine XML <node1> </node1> <node1> <node2> <node1/> </node2> </node1 Was ich nun an der Stelle des ?? in dem ersten Template benötige, ist die Rekursionstiefe, wie oft mein Template item in sich selbst aufgerufen wurde, d.h. beim Bsp 1 wäre die Rekursionstiefe 1 und beim zweiten 3. Was ich nicht machen kann dem item Template einen Parameter mit geben, so dass ich bei jeden call-template den Zähler inkrementiere. Wie kann ich die Anzahl der rekursiven Aufrufe eines Templates erhalten? Danke Zitieren
uenetz Geschrieben 27. Februar 2013 Geschrieben 27. Februar 2013 Servus, hast Du eine Möglichkeit in das Template einen Counter zu integrieren, der den Zähler z.B. in einem File speichert bzw. auch daraus liest? Zitieren
flashpixx Geschrieben 27. Februar 2013 Autor Geschrieben 27. Februar 2013 hast Du eine Möglichkeit in das Template einen Counter zu integrieren, der den Zähler z.B. in einem File speichert bzw. auch daraus liest? Ein counter wird hier IMHO nicht funktionieren, denn ich will ja nicht die Anzahl der Nodes ermitteln (wobei sich das count nur auf die Nodes des XML Baums bezieht), sondern ich will ja die Rekursionstiefe des Templates feststellen z.B. <node1> <node2/> </node1> dazu dann <xsl:template match="node2"> <xsl:call-template name="sub"> <xsl:with-param select="x"> <xsl:call-template name="item"> <xsl:with-param select="v"> <xsl:value-of select="."/> </xsl:with-param> </xsl:call-template> </xsl:with-param> </xsl:call-template> </xsl:template> <xsl:template match="sub"> <xsl:param value="x/> <xsl:call-template name="item"> <xsl:with-param select="v"> <xsl:value-of select="$x"/> </xsl:with-param> </xsl:call-template> </xsl:template> <xsl:template match="item"> <xsl:param value="v/> <xsl:text>v</xsl:text> </xsl:template> In diesem Fall würde der counter 0 liefern, denn die Kinder der Node 2 existieren sind, hier müsste aber 2 geliefert werden, denn aufgrund des ersten call templates in node2-Match würde das item-Template aufgerufen (+1) und dann aus dem sub-Template ebenfalls (+1), d.h. innerhalb des sub-Templates müsste eine 2 in item vorhanden sein. Da die Rekursionstiefe nicht von dem eingegebenen XML Baum abhängig ist, sondern von den konkreten Aufrufen der XSL Knoten muss das Template seine eigene Rekursionstiefe bestimmen können. Der Counter arbeitet auf den Nodes des XML Baumes, ich kann nicht aufgrund des XML Baumes die Rekursionstiefe effizient ermitteln (bzw. dies wäre zu umständlich, da ich jeden möglichen Fall betrachten muss, was das Problem dann ggf NP-schwer macht) Zitieren
uenetz Geschrieben 27. Februar 2013 Geschrieben 27. Februar 2013 Wie sieht es denn damit aus, die Templates vor der Ausgabe zu parsen und anhand von Schlüssenwörtern so die Tiefe zu ermitteln? Zitieren
flashpixx Geschrieben 27. Februar 2013 Autor Geschrieben 27. Februar 2013 Wie sieht es denn damit aus, die Templates vor der Ausgabe zu parsen und anhand von Schlüssenwörtern so die Tiefe zu ermitteln? siehe unten ! Es ist nicht relevant wie die Template anhand der Deklaration verschachtelt sind, sondern wie sich die konkret dynamisch erzeugte Nodestruktur anhand der Eingabedaten ergibt. Ich benötige den dynamisch erzeugten Baum, der sich aus XML & XSL ergibt. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.