我的xml看起来像下一个:
<root>
<r time="2" user="loginIP=100&loginName=a0" />
<r time="3" user="loginIP=101&loginName=a2" />
<r time="4" user="loginIP=102&loginName=a3" />
<r time="6" user="loginIP=101&loginName=a2" />
<r time="5" user="loginIP=104&loginName=a5" />
<r time="8" user="loginIP=105&loginName=a7" />
<r time="9" user="loginIP=105&loginName=a7" />
<r time="11" user="loginIP=104&loginName=a5" />
</root>
问:现在我想获得每个用户的总时间(loginName代表用户),然后显示哪个用户的总时间最短,以及哪个用户的总时间最长。
我尝试使用://r [not(substring-after(./@user,"loginName=")=substring-after(following-sibling::r/@user,"loginName=“))]]要先获取所有用户名,但失败,此xpath将返回重复值。
那么我怎样才能实现目标呢?
答案 0 :(得分:1)
XSLT 1.0样式表
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="user" match="root/r" use="substring-after(substring-after(@user, '='), '=')"/>
<xsl:template match="root">
<xsl:apply-templates select="r[generate-id() = generate-id(key('user', substring-after(substring-after(@user, '='), '='))[1])]">
<xsl:sort select="sum(key('user', substring-after(substring-after(@user, '='), '='))/@time)" data-type="number"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="root/r">
<xsl:value-of select="concat('User: ', substring-after(substring-after(@user, '='), '='), ': ', sum(key('user', substring-after(substring-after(@user, '='), '='))/@time))"/>
<xsl:if test="position() = 1">
<xsl:text> (minimum)</xsl:text>
</xsl:if>
<xsl:if test="position() = last()">
<xsl:text> (maximum)</xsl:text>
</xsl:if>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
使用Muenchian分组按用户分组,然后按每组sum
值的@time
排序,输出排序值,表示最小值和最大值。
因此,对于您的样本,输出是
User: a0: 2 (minimum)
User: a3: 4
User: a2: 9
User: a5: 16
User: a7: 17 (maximum)