我在某些条件下增加计数器时遇到问题。
输入:
<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
- 标签丢失
有什么想法吗?