условное приращение xslt

У меня проблемы с увеличением счетчика при определенных условиях.

Входные данные:

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

Требуемый выход:

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

Для этого может быть использован следующий алгоритм:

сортировать ввод по имени пользователядля каждого пользователякогда предыдущее имя пользователя равно текущему имени пользователясчетчик приращений иустановить имя пользователя в $ username $ counterв противном случаеустановить счетчик на 1(снова отсортировать по id - не обязательно)

Поэтому я попытался преобразовать это в XSLT:

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

Однако, выполнив это, я получаю следующие ошибки:

имена пользователей не сортируютсясчетчик не увеличиваетсявместо этого, когда условие соответствует, счетчик будет текущей позицией узла.для нашего примера узел с id = 3 будет иметь имя пользователя = bob03тег отсутствует

есть идеи?

Ответы на вопрос(2)

Ваш ответ на вопрос