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