xslt bedingtes Inkrement

Ich habe Probleme, einen Zähler unter bestimmten Bedingungen zu erhöhen.

Eingang:

<Users>
  <User>
    <id>1</id>
    <username>jack</username>
  </User>
  <User>
    <id>2</id>
    <username>bob</username>
  </User>
  <User>
    <id>3</id>
    <username>bob</username>
  </User>
  <User>
    <id>4</id>
    <username>jack</username>
  </User>
</Users>

Gewünschte Ausgabe:

<Users>
  <User>
    <id>1</id>
    <username>jack01</username>
  </User>
  <User>
    <id>2</id>
    <username>bob01</username>
  </User>
  <User>
    <id>3</id>
    <username>bob02</username>
  </User>
  <User>
    <id>4</id>
    <username>jack02</username>
  </User>
</Users>

Um dies zu erreichen, kann folgender Algorithmus verwendet werden:

Eingabe nach Benutzername sortierenfür jeden BenutzerWenn der vorherige Benutzername gleich dem aktuellen Benutzernamen istInkrementzähler undSetze den Benutzernamen auf '$ username $ counter'AndernfallsZähler auf 1 stellen(erneut nach ID sortieren - nicht unbedingt erforderlich)

Also habe ich versucht, dies in XSLT umzuwandeln:

  <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="Users">
    <Users>
    <xsl:apply-templates select="create_user">
      <xsl:sort select="User/username"/>
    </xsl:apply-templates>
    </Users>
  </xsl:template>

  <xsl:template match="create_user">
    <id><xsl:value-of select="id"/></id>
    <xsl:choose>
      <xsl:when test="username=(preceding-sibling::User[1]//username)">
        <xsl:variable name="count">
          <xsl:number format="01"/>
        </xsl:variable>
        <username><xsl:value-of select="concat(username, $count)"/></username>
      </xsl:when>
      <xsl:otherwise>
        <xsl:variable name="count">
          <xsl:number value="1" format="01"/>
        </xsl:variable>
        <username><xsl:value-of select="concat(username, $count)"/></username>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>    

Allerdings erhalte ich bei der Ausführung folgende Fehler:

Benutzernamen werden nicht sortiertZähler erhöht nichtWenn die Bedingung mit dem Zähler übereinstimmt, wird stattdessen die aktuelle Knotenposition angezeigt.In unserem Beispiel hätte der Knoten mit der ID = 3 den Benutzernamen = bob03Der Tag fehlt

Irgendwelche Gedanken?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage