XSL Inkrementor

Kababär

Top Contributor
Hi,

ich suche nach einer Möglichkeit, eine "Number"-Variable in einer for-each zu inkrementieren, falls eine <xsl:if/> Bedinung "true" ist.
Leider habe ich noch nichts dazugefunden..
Grund ist, ich will alle Elemente zählen, die gewissen Bedingungen entsprechen.
Wie ich alle Elemente zähle, ist mir bewusst, nur wie ich das mit der Bedingung verknüpfe, weiß ich nicht.
Hat jemand eine Idee?

Derzeit arbeite ich <xsl:number count="meinElement" format="1"/>
 

BuckRogers

Bekanntes Mitglied
HTML:
<xsl:for-each>
    <!-- do some stuff -->
    <xsl:if test="...">
         <xsl:number count="meinElement" format="1"/>     
    </xsl:if>
    <!-- do other stuff -->
</xsl:for-each>

so vielleicht?
 

Kababär

Top Contributor
Habe ich mir auch schon überlegt, allerdings ist "meinElement" schon das niedrigste Element in meiner Hierarchie und für dieses Element werden Bedingungen aufgestellt.
Die Bedingungen funktionieren ganz gut, nur würde ich bei der Aufzählungen, bei der die Bedingungen zutreffen, gerne bei 1 anfangen lassen zu zählen und immer um 1 erhöhen lassen.
Derzeit ist die Startzahl bei 400. Die nächste Zahl liefert 550...
Weißt du was ich meine?
 

Kababär

Top Contributor
Code:
<type name="Typ1">
    <liste>
        <listName att="Ein Text"/>
        <listName att="Noch ein Text"/>
    </liste>
</type>
<type name="Typ2">
    <liste>
        <listName att="Ein Block"/>
        <listName att="Kein Block, sondern ein Text"/>
    </liste>
    <liste>
         <listName att="Block oder kein Block? Also Text?"/>
         <listName att="Nur Bloecke"/>
    </liste>
<type>

Hier würde ich gerne zählen, wie viele listNamen es gibt, wo das Wort Text vorkommt.
Als Erstes soll der name vom Typ ausgegeben werden, und dann an welcher Stelle es vorkommt im Zähler.
Bspw: Output
1,Typ1
1,Typ1
2,Typ2
2,Typ2

Erste Zahl steht für den Zähler, zweiter Name für den Typnamen, dabei wird die Zahl nur dann erhöht, wenn wir uns auch beim nächsten Typnamen befinden.
Allerdings werden beide zwei Mal ausgegeben, da sie jeweils zwei Attribute haben, in denen Text vorkommt.
 

BuckRogers

Bekanntes Mitglied
Verstehe,

einziges Problem ist das zählen/inkrementieren einer Variable. Eventuell hilft die position()-Funktion weiter?
Du brauchst halt 3 for-each hinterinenander type/liste/listName.
Dann besteht das Problem, dass contains() nur true oder false zurück gibt und nicht die Anzahl der Vorkommnisse zählt.
Du müsstest die eine Formatvorlage bauen, welche den ganzen String zepflückt um einen String zu zählen.
 

Kababär

Top Contributor
Also mit contains bin ich soweit gut gefahren und konnte prüfen ob Text vorkommt. Wirklich nur das hochzählen stellt ein Problem dar. Eigentlich schon recht lustig, dass XLST dafür keine implementierte Lösung bietet.. aber ist ja eher eine prozedurale Sprache.
Position() bezieht sich nur auf eine einzige List. Heißt, wenn ich wieder in einer anderen Liste lande, fängt er wieder bei 0 an zu zählen.
 

BuckRogers

Bekanntes Mitglied
Eventuell hilft etwas in diese Richtung?

<xsl:value-of select="count(/type/liste[listName='contains('Text')'])"/>

Edit: das ist natürlich totaler Murks.

Das ist echt ein schwieriges Problem. Eventuell hilft XPath weiter. Ich komm mit meinen xslt basics da auch nicht weiter. Sorry
 

Neue Themen


Oben