Thomas J.S.: XSLT / Schleife und choose

Beitrag lesen

Hallo,

Ist es möglich bei der Bedingung dynamisch zu ermitteln, wieviele Überschriften das XML-File hat.

Ja, aber das kannst du auch statisch machen, schließlich wird dein XML nicht während der XSL-Transformation erweitert.

(globale) variable name="anzahlKap" select="count(//Kapitel)"

Mit count() und sum() habe ich es noch nicht geschafft.

???

Oder kann ich auch eine xquery-Abfrage in mein XSLT-File einbauen?

Nein, aber auch wenn ja, was würde das ändern?

Die Bedingung für den Parameter muß angeblich im choose-Konstrukt stehen.

Das verstehe ich nicht.

Quelltext:

<xsl:apply-templates select="Handbuch/Handbuchinhalt/Kapitel">
<xsl:with-param name="Zaehlen">1</xsl:with-param>
</xsl:apply-templates>

Damit initiierst du das Template für _jedes einzelnen_ <Kapitel> mit dem Zähler 1 auf.

<xsl:template match="Handbuch/Handbuchinhalt/Kapitel" name="Schleife">

Das Template ergibt keinen Sinn.

<!-- Bei der Verarbeitung bleibt der Prozeß bei jeder Überschrift 27 x stehen, daher werden 27 x 27 Überschriften ausgegeben. -->

Ja, denn genau das ist im Template definiert:

<xsl:when test="$Zaehlen &lt;=27 and @kapiteltyp='Hauptkapitel'">

Sagt: wenn $x kleiner als 27 und ...

<xsl:value-of select="concat($Zaehlen, '.' , ' ' , //Kapitel[position()=$Zaehlen])"/>

Sagt: gib aus: "$x. TextVomKapitel[...]"

<xsl:call-template name="Schleife">
<xsl:with-param name="Zaehlen" select="$Zaehlen + 1"/>
</xsl:call-template>

*** Sagt: rufe Template (hier rekursiv) auf mit $x+1

Und was passiert?
Das Template wird aufgerufen ($x = 2) --> rattert durch erreicht *** und ruft Template (hier rekursiv) auf mit $x+1

Und was passiert?
Das Template wird aufgerufen ($x = 3) --> rattert durch erreicht *** und ruft Template (hier rekursiv) auf mit $x+1

Und was passiert?
Das Template wird aufgerufen ($x = 4) --> rattert durch erreicht *** und ruft Template (hier rekursiv) auf mit $x+1

Und so witer ... bis Zähler 26 ist --> rattert durch erreicht *** und ruft Template (hier rekursiv) auf mit $x+1
Das Template wird aufgerufen ($x = 27) --> Bedingung ( $x kleiner als 27) nicht mehr erfüllt, gehe zu nächsten when oder zu otherwiese und falls nicht vorhanden, bedende die Abarbeitung des Templates.

</xsl:when>

$Zaehlen = 27

<!--
<xsl:when test="@kapiteltyp='Hauptkapitel'">
<h1>
<xsl:value-of select="concat($Zaehlen, '.' , ' ' , node())"/>
</h1>
<br/>
<xsl:call-template name="Schleife">
<xsl:with-param name="Zaehlen" select="$Zaehlen + 1"/>
</xsl:call-template>

Ruft das Template mit 27+1 auf
Das Template wird aufgerufen ($x = 28) --> Bedingung ( $x kleiner als 27) nicht mehr erfüllt, gehe zu nächsten when oder zu otherwiese.

Das Template wird aufgerufen ($x = 29) --> Bedingung ( $x kleiner als 27) nicht mehr erfüllt, gehe zu nächsten when oder zu otherwiese.
...

Und wir haben eine wunderbare Endlosschleife geschaffen, nur gut, dass das ganze zweite when auskommentiert war ;-)

Wenn du für deinen Vergleich bereits position() verwendest "Kapitel[position()=$Zaehlen]" , warum gibst du nicht einfach die Position aus?
Da ich aber nicht weiss, wie deine Nummerierung aussehen soll (unterkapitel??) kann ich auch keine Vorschläge machen.

Grüße
Thomas