【问题标题】:XSLT: Using for-each-group to separate into groupsXSLT:使用 for-each-group 分组
【发布时间】:2018-11-25 17:11:34
【问题描述】:

我想使用 for-each-group 按角色的加速度 (accel) 对角色进行分组并对组进行排序。这样格式如下:

<results>
  <result accel =" lowest-value">
     <name>Character 1</name>
     <name>Character 2</name>
     ...
  </result>
  ...
  <result accel="highest-value">
     <name>Character 7</name>
     <name>Character 8</name>
      ...
  </result>
</results>

我已经计算出一个平均值,然后在名称中添加了一个属性来对它们进行分组,但我一直坚持如何在其上使用 for-each-group。我是使用 XSLT 的新手,但以下是我的尝试:

<xsl:template match ="/">
    <xsl:variable name="path" select="mariokart/characters/character"/>
    <xsl:variable name="accel" select="mariokart/characters/character/accel"/>
    <xsl:variable name="name" select="mariokart/characters/character/name"/>
    <xsl:variable name="averageaccel" select="sum($accel) div count($path)"/>

    <xsl:for-each select="$name">
        <xsl:copy>
            <xsl:attribute name="accelgroup">
                <xsl:choose>
                    <xsl:when test="(../accel&gt;=$averageaccel)">
                        <xsl:text>highest-value</xsl:text>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:text>lowest-value</xsl:text>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:attribute>
        </xsl:copy>
    </xsl:for-each>

    <results>     
        <xsl:for-each-group select="$name" group-by="@accelgroup">
            <result accel="{current-grouping-key()}">
                <xsl:for-each select="current-group()">
                    <name><xsl:copy-of select="."/></name>
                </xsl:for-each>
            </result>
        </xsl:for-each-group>
    </results>
</xsl:template>

xml 示例:

<mariokart>
<characters>
    <character>
        <name>Baby Peach</name>
        <speed>
            <land>2.25</land>
            <anti-g>2</anti-g>
            <water>2.5</water>
            <air>2.75</air>
        </speed>
        <accel>4</accel>
        <weight>2</weight>
        <handling>
            <land>5</land>
            <anti-g>5</anti-g>
            <water>4.5</water>
            <air>5</air>
        </handling>
        <traction>4.25</traction>
        <M-turbo>4</M-turbo>
    </character>
    <character>
        <name>Baby Rosalina</name>
        <speed>
            <land>2.25</land>
            <anti-g>2</anti-g>
            <water>2.5</water>
            <air>2.75</air>
        </speed>
        <accel>4.25</accel>
        <weight>2</weight>
        <handling>
            <land>4.75</land>
            <anti-g>4.75</anti-g>
            <water>4.25</water>
            <air>4.75</air>
        </handling>
        <traction>3.75</traction>
        <M-turbo>4</M-turbo>
    </character>
    <character>
        <name>Baby Mario</name>
        <speed>
            <land>2.5</land>
            <anti-g>2.25</anti-g>
            <water>2.75</water>
            <air>3</air>
        </speed>
        <accel>4.25</accel>
        <weight>2.25</weight>
        <handling>
            <land>4.5</land>
            <anti-g>4.5</anti-g>
            <water>4</water>
            <air>4.5</air>
        </handling>
        <traction>4</traction>
        <M-turbo>3.75</M-turbo>
    </character>
</characters>
</mariokart>

【问题讨论】:

    标签: xml xslt xslt-2.0


    【解决方案1】:

    我想...按角色的加速度 (accel) 和 对组进行排序。

    您不能简单地通过以下方式实现这一目标:

    XSLT 2.0

    <xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/mariokart">
        <results>
            <xsl:for-each-group select="characters/character" group-by="accel">
                <xsl:sort select="current-grouping-key()" data-type="number" order="ascending"/>
                <result accel="{current-grouping-key()}">
                    <xsl:copy-of select="current-group()/name"/>
                </result>
            </xsl:for-each-group>
        </results>
    </xsl:template>
    
    </xsl:stylesheet>
    

    演示http://xsltransform.hikmatu.com/bdxtpE

    【讨论】:

    • 完美!这以一个简单、干净的解决方案解决了它。我意识到我误解了我朋友要求我帮助他们的内容,而实际上你的解释是正确的。我把问题改成了他们真正的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多