hh: fortlaufende Nummerierung

Hallo,

2 Fragen zur Nummerierung. Wie sollte man es anstellen, wenn man eine Variable benutzen möchte, die sich bei jedem Aufruf um den Wert 1 erhöht soll.

a)Ich möchte eine Art Fehlerreport intergrieren und wollte nun die Fehler durchlaufend nummerieren. Die Prüfungen, ob ein Fehler vorliegt sind an verschiedenen Stellen im xsl dokument. Nun soll es so sein, dass ein fehler in form eines Kommentars (oder wie auch immer) ausgegeben wird und dabei noch der wievielte Fehler. Also bräuchte ich eine variable, die immer bei fehler um eins erhöht wird. Ich habe noch keine richtige Lösung gefunden.

b)Der andere Fall. ich möchte ein Template nacheinander aufrufen, und auch hier fortlaufende eine Nummer übergeben. Kann man das mit xsl:number realisieren (Es sollte aber in keine Schleife eingebungen werden). Sachverhalt etwa

<xsl:call-template name="X">
<xsl:with-param name="Zaehler">
 <xsl:value-of select="1"/>
</xsl:with-param>
</xsl:call-template>

<xsl:call-template name="X">
<xsl:with-param name="Zaehler">
 <xsl:value-of select="2"/>
</xsl:with-param>
</xsl:call-template>

<xsl:call-template name="X">
<xsl:with-param name="Zaehler">
 <xsl:value-of select="3"/>
</xsl:with-param>
</xsl:call-template>

Gruß, Holger

  1. Also eine schöne sauber Lösung wird es kaum geben, weil Variablen im XSL für immer den Wert behalten mit dem sie initialisiert werden, das Ändern von Wertenim nachhinein ist NICHT möglich.

    Hat den Grund, dass xsl eine Darstellungssprache und keine Sprache zur Berechnung oder Auswertung ist (zumindest was den Urgedanken dahinter angeht).

    1. Hm, ich weiss, aber muss es trotzdem irgendwie hinbekommen ;-) Na ja, fuer erstgenannten Fall werde ich wohl Teildokumente erstellen. und bei jedem Fehler prüfen, ob ein fehlerdokumentschon besteht und wenn ja dann immer einen hochzählen und am Ende alle teildokuemnte zusammenführen. Jetzt bleibt nur noch die Frage, wie ich es eventuell mit dem Templates hinbekomme, dass dort immer die wert +1 genommen wird.

      <xsl:call-template name="X">
      <xsl:with-param name="Zaehler">
       <xsl:value-of select="1"/>
      </xsl:with-param>
      </xsl:call-template>

      <xsl:call-template name="X">
      <xsl:with-param name="Zaehler">
       <xsl:value-of select="2"/>
      </xsl:with-param>
      </xsl:call-template>

      <xsl:call-template name="X">
      <xsl:with-param name="Zaehler">
       <xsl:value-of select="3"/>
      </xsl:with-param>
      </xsl:call-template>

      Na ja, mal lange nachdenken, Gruß und trotzdem danke fuer die Antwort

  2. Hallo,

    2 Fragen zur Nummerierung. Wie sollte man es anstellen, wenn man eine Variable benutzen möchte, die sich bei jedem Aufruf um den Wert 1 erhöht soll.

    a)Ich möchte eine Art Fehlerreport intergrieren und wollte nun die Fehler durchlaufend nummerieren. Die Prüfungen, ob ein Fehler vorliegt sind an verschiedenen Stellen im xsl dokument. Nun soll es so sein, dass ein fehler in form eines Kommentars (oder wie auch immer) ausgegeben wird und dabei noch der wievielte Fehler. Also bräuchte ich eine variable, die immer bei fehler um eins erhöht wird. Ich habe noch keine richtige Lösung gefunden.

    Eine geringe Chance besteht dazu (funktioniert wie unter https://forum.selfhtml.org/?t=137147&m=890833):

    ----------------
    <xsl:key name="fehler" match="foo | bar" use="XXXX" />

    <xsl:template match="foo">
     <xsl:variable name="this" select="." />
     xsl:choose
      <xsl:when test="XXXX">
       <xsl:for-each select="key('fehler' XXXX)">
        <xsl:if test="generate-id(.) = generate-id($this)">
         <xsl:call-template name="fehler">
          <xsl:with-param name="fehlerNR" select="position()" />
         </xsl:call-template>
        </xsl:if>
       </xsl:for-each>
      </xsl:when>
      xsl:otherwiseOK</xsl:otherwise>
     </xsl:choose>
    </xsl:template>

    <xsl:template match="bar">
     <xsl:variable name="this" select="." />
     xsl:choose
      <xsl:when test="XXXX">
       <xsl:for-each select="key('fehler' XXXX)">
        <xsl:if test="generate-id(.) = generate-id($this)">
         <xsl:call-template name="fehler">
          <xsl:with-param name="fehlerNR" select="position()" />
         </xsl:call-template>
        </xsl:if>
       </xsl:for-each>
      </xsl:when>
      xsl:otherwiseOK</xsl:otherwise>
     </xsl:choose>
    </xsl:template>

    <xsl:template name="fehler">
     <xsl:param name="fehlerNR" />
     fehler: <xsl:value-of select="$fehlerNR" />
    </xsl:template>
    ---------------

    Die Chance besteht dann, wenn du XXXX als Bedingung so defineren kannst, dass du es an allen drei Stellen verwenden kannst _und_ die Bedingung trifft bei allen Elementen: z.B. wenn XXXX ein Attribut/Element mit meinem Bestimmten Wert ist, kannst du das verwenden, es ist auch möglich dass du XPath-Ausdrücke als Bedingung definierst. Was nicht gehen wird, ist die Hochzählung wenn die Bedingung in jedem Template anders ist.

    b)Der andere Fall. ich möchte ein Template nacheinander aufrufen, und auch hier fortlaufende eine Nummer übergeben. Kann man das mit xsl:number realisieren (Es sollte aber in keine Schleife eingebungen werden). Sachverhalt etwa

    Verstehe die Frage nicht und wozu überhaupt xsl:number verwenden?
    Du kannst ein benanntes Template beliebig oft und an verschiedenen Stellen aufrufen und du kannst dabei jedes Mal andere Parameterwerte übergeben.

    Grüße
    Thomas