Rekursion ?
liri
- xsl
Hallo
Könnte mir jemand eine Beschreibung zur Rekursion geben? Ich habe zwar ein Beispiel eines Templates, dass sich immer wider aufruft, aber ich komme damit nicht klar.
Ich müsste ein rekursives Template schreiben, dass folgendes tut:
"AnzLeerzeilen = (ZeileIndex + X) - ZeileNummer"
Wobei X jeweils um AnzLeerzeilen erhöht wird.
Das ist ziemlich schwierig ohne Grundlage.
Danke im Voraus!
Grüsse
liri
Hallo
Könnte mir jemand eine Beschreibung zur Rekursion geben? Ich habe zwar ein Beispiel eines Templates, dass sich immer wider aufruft, aber ich komme damit nicht klar.
Hier ein typisches Beispiel für eine Rekursion (läuft genau so im IE oder auch Saxon, brauchste nur zu kopieren)
Umwandlung einer Liste komma-separierter Werte in eine HTML-Ausgabe. Jeder einzelne Wert wird in einem <p>-Tag ausgegeben.
Die Template-Rule split-tokens ruft sich immer wieder mit einem Parameterwert auf, der innerhalb des Templates verändert wird (du kannst genausogut auch einfach 1 addieren). Genauer gesagt es wird immer wieder das gerade bearbeitete Token aus der Liste geworfen und dann die Liste immer wieder bearbeitet bis irgendwann eben kein Wert mehr übrig ist.
Das Prinzip auf Dein Beipsiel zu übertragen überlasse ich Dir ;-)
Grundlagen dazu sind:
xsl:call-template, xsl:variable, xsl:parameter, xsl:with-param
Erklärungen dazu findest du alle in SELFHTML.
<?xml version="1.0"?>
<?xml-stylesheet href="../xsl/xsl3.xsl" type="text/xsl"?>
<a1>1,2,3</a1>
<?xml version="1.0"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
<xsl:template match="/">
<html>
<head><title>Test</title>
</head>
<body>
<xsl:variable name="zahlenString"><xsl:value-of select="a1"/></xsl:variable>
<xsl:call-template name="split-tokens">
<xsl:with-param name="zahlenliste" select="concat(normalize-space($zahlenString), ',')"/>
</xsl:call-template>
</body>
</html>
</xsl:template>
<xsl:template name="split-tokens">
<xsl:param name="zahlenliste"/>
<xsl:variable name="nZahlenliste" select="$zahlenliste"/>
<xsl:variable name="erstesToken" select="substring-before($nZahlenliste, ',')"/>
<xsl:variable name="restlicheToken" select="substring-after($nZahlenliste, ',')"/>
<p><xsl:value-of select="$erstesToken"/></p>
<xsl:if test="$restlicheToken">
<xsl:call-template name="split-tokens">
<xsl:with-param name="zahlenliste" select="$restlicheToken"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Gruß
Franz
Hallo Franz,
danke für Deine Hilfe. Dein Beispiel habe ich geschnallt.
Allerdings wird das umsetzen noch einige Probleme machen.
Ich hoffe ich darf Dich nochmals anpeilen desswegen.
Vielen Dank und Gruß
liri