【问题标题】:Using xsl:for-each-group to select and aggregate values from an attribute使用 xsl:for-each-group 从属性中选择和聚合值
【发布时间】:2019-02-20 20:42:16
【问题描述】:

我正在尝试使用 xsl:for-each-group 来获得每个用户对每种类型的平均评分。

示例 XML:

    <Ratings>
    <Rating name="Type1">
        <items userID="001" rating="5"/>
        <items userID="001" rating="3"/>
        <items userID="002" rating="2"/>
        <items userID="003" rating="5"/>
    </Rating>
    <Rating name="Type2">
        <items userID="002" rating="3"/>
        <items userID="003" rating="4"/>
        <items userID="003" rating="3"/>
    </Rating>
    <Rating name="Type3">
        <items userID="002" rating="5"/>
        <items userID="003" rating="5"/>
    </Rating>
</Ratings>

我已经了解了下面的 XSLT(从一个通用的复制模板开始,未显示)。

<xsl:template match="Rating">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:attribute name="averageRating">
            <xsl:value-of select="round(avg(items/@rating), 2)"/>
        </xsl:attribute>
        <xsl:for-each-group select="items" group-by="@userID">
            <userRating userID="{@userID}">
                <xsl:for-each select="current-group()">
                    <xsl:attribute name="averageRating">
                        <xsl:value-of select="round(avg(current()/@rating),2)"/>
                    </xsl:attribute>
                </xsl:for-each>
            </userRating>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

这让我(似乎?)接近 - 每个用户都被列出一次,他们对所属类型的评分显示在 averageRating 属性中。除非在一个类型中存在多个用户评分,否则仅显示最后一个评分,而不是该用户在该类型中所有评分的平均值。

当前输出:

    <Ratings>
    <Rating name="Type1" averageRating="3.75">
      <userRating userID="001" averageRating="3"/>
      <userRating userID="002" averageRating="2"/>
      <userRating userID="003" averageRating="5"/>
   </Rating>
    <Rating name="Type2" averageRating="3.33">
      <userRating userID="002" averageRating="3"/>
      <userRating userID="003" averageRating="3"/>
   </Rating>
    <Rating name="Type3" averageRating="5">
      <userRating userID="002" averageRating="5"/>
      <userRating userID="003" averageRating="5"/>
   </Rating>
</Ratings>

期望的输出:

    <Ratings>
    <Rating name="Type1" averageRating="3.75">
      <userRating userID="001" averageRating="4"/> <!-- average of 5 and 3 -->
      <userRating userID="002" averageRating="2"/>
      <userRating userID="003" averageRating="5"/>
   </Rating>
    <Rating name="Type2" averageRating="3">
      <userRating userID="002" averageRating="3"/>
      <userRating userID="003" averageRating="3.5"/> <!-- average of 4 and 3 -->
   </Rating>
    <Rating name="Type3" averageRating="5">
      <userRating userID="002" averageRating="5"/>
      <userRating userID="003" averageRating="5"/>
   </Rating>
</Ratings>

当我将 rating 的值添加为元素值(而不是作为属性)时,所有的 rating 都会显示,但是作为一个字符串,即计算仍然不起作用,例如:

      <userRating userID="001">53</userRating>

谢谢

【问题讨论】:

    标签: xml xslt-2.0


    【解决方案1】:

    代替

        <userRating userID="{@userID}">
                <xsl:for-each select="current-group()">
                    <xsl:attribute name="averageRating">
                        <xsl:value-of select="round(avg(current()/@rating),2)"/>
                    </xsl:attribute>
                </xsl:for-each>
            </userRating>
    

    你只是想要

    <userRating userID="{@userID}" averageRating="{round(avg(current-group()/@rating),2)}">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-23
      • 2012-10-22
      • 1970-01-01
      • 2012-07-20
      • 2010-12-10
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      相关资源
      最近更新 更多