0

我的 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>

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

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

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

4

1 回答 1

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)
于 2012-11-22T10:11:54.263 回答