xsl根据不同的值计算

时间:2012-11-22 08:55:02

标签: xslt distinct

我的xml看起来像下一个:

<root>
  <r time="2" user="loginIP=100&amp;loginName=a0" />
  <r time="3" user="loginIP=101&amp;loginName=a2" />
  <r time="4" user="loginIP=102&amp;loginName=a3" />
  <r time="6" user="loginIP=101&amp;loginName=a2" />
  <r time="5" user="loginIP=104&amp;loginName=a5" />
  <r time="8" user="loginIP=105&amp;loginName=a7" />
  <r time="9" user="loginIP=105&amp;loginName=a7" />
  <r time="11" user="loginIP=104&amp;loginName=a5" />
</root>

问:现在我想获得每个用户的总时间(loginName代表用户),然后显示哪个用户的总时间最短,以及哪个用户的总时间最长。

我尝试使用://r [not(substring-after(./@user,"loginName=")=substring-after(following-sibling::r/@user,"loginName=“))]]要先获取所有用户名,但失败,此xpath将返回重复值。

那么我怎样才能实现目标呢?

1 个答案:

答案 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>&#10;</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)