有效的xslt条件增量 [英] efficient xslt conditional increment
本文介绍了有效的xslt条件增量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在此问题中,我问如何执行条件增量.提供的答案有效,但不适用于庞大的数据集.
In this question i asked how to perform a conditional increment. The provided answer worked, but does not scale well on huge data-sets.
输入:
<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>
所需的输出(最佳时间复杂度):
The desired output (in optimal time-complexity):
<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"
- sort input by username
- for each user
- when previous username is equals current username
- increment counter and
- set username to '$username$counter'
- 将计数器设置为1
有什么想法吗?
推荐答案
此转换准确地产生了指定的所需结果,并且效率很高(O(N)):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="kUserByName" match="User" use="username"/> <xsl:key name="kUByGid" match="u" use="@gid"/> <xsl:variable name="vOrderedByName"> <xsl:for-each select= "/*/User[generate-id()=generate-id(key('kUserByName',username)[1])]"> <xsl:for-each select="key('kUserByName',username)"> <u gid="{generate-id()}" pos="{position()}"/> </xsl:for-each> </xsl:for-each> </xsl:variable> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="username/text()"> <xsl:value-of select="."/> <xsl:variable name="vGid" select="generate-id(../..)"/> <xsl:for-each select="ext:node-set($vOrderedByName)[1]"> <xsl:value-of select="format-number(key('kUByGid', $vGid)/@pos, '00')"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
应用于提供的XML文档:
<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>
这篇关于有效的xslt条件增量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
- when previous username is equals current username
- 先前的用户名等于当前的用户名时
查看全文