根据不同值进行 XSL 计算

  • 本文关键字:XSL 计算 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(follow-sibling::r/@user,"loginName="))] 首先获取所有用户名,但它失败了,这个 xpath 将返回重复值。

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

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分组按用户分组,然后按每个组中@time值的sum进行排序,以输出排序后的值,指示最小值和最大值。

因此,对于您的样品,输出是

User: a0: 2 (minimum)
User: a3: 4
User: a2: 9
User: a5: 16
User: a7: 17 (maximum)

最新更新