fjh: Rekursion ?

Beitrag lesen

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-Datei

<?xml version="1.0"?>
<?xml-stylesheet href="../xsl/xsl3.xsl" type="text/xsl"?>
<a1>1,2,3</a1>

XSL-Datei

<?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