# XSL Inkrementor



## Kababär (31. Mai 2016)

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 (31. Mai 2016)

```
<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 (31. Mai 2016)

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?


----------



## BuckRogers (31. Mai 2016)

Ne,

verstehe ich nicht. Kannst du vielleicht das xml posten?


----------



## Kababär (31. Mai 2016)

```
<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 (31. Mai 2016)

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 (31. Mai 2016)

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 (31. Mai 2016)

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


----------

