使用 xslt 按属性值排序 xml

Sorting xml by attribute value with an xslt

我在 xslt 方面不是很熟练,但我希望根据统计名称属性的值在 xml 中对我的数据进行排序。

这是我的数据:

<SeasonStatistics>
<Team name="X" id="000000">
<Player first_name="A">
<Stat name="STATCAT1">42</Stat>
<Stat name="STATCAT2">1</Stat>
<Stat name="STATCAT3">1</Stat>
</Player>
<Player first_name="B">
<Stat name="STATCAT1">187</Stat>
<Stat name="STATCAT2">1</Stat>
<Stat name="STATCAT3">15</Stat>
</Player>
<Player first_name="C">
<Stat name="STATCAT1">92</Stat>
<Stat name="STATCAT2">3</Stat>
<Stat name="STATCAT3">5</Stat>
</Player>
</Team>

输出应该如下所示:

<SeasonStatistics>
<Team name="X" id="000000">
<Player first_name="B">
<Stat name="STATCAT1">187</Stat>
<Stat name="STATCAT2">1</Stat>
<Stat name="STATCAT3">15</Stat>
</Player>
<Player first_name="C">
<Stat name="STATCAT1">92</Stat>
<Stat name="STATCAT2">3</Stat>
<Stat name="STATCAT3">5</Stat>
</Player>
<Player first_name="A">
<Stat name="STATCAT1">42</Stat>
<Stat name="STATCAT2">1</Stat>
<Stat name="STATCAT3">1</Stat>
</Player>
</Team>

这是我尝试过的方法,但似乎没有用。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:strip-space elements="*" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Team">
    <xsl:copy>
        <xsl:apply-templates select="Player">
            <xsl:sort select="Stat"/>
                        <xsl:sort select="@STATCAT1" data-type="number" order="descending"/>
        </xsl:apply-templates>
    </xsl:copy>
        </xsl:template>
</xsl:stylesheet>

而不是:

  <xsl:template match="Team">
    <xsl:copy>
        <xsl:apply-templates select="Player">
            <xsl:sort select="Stat"/>
                        <xsl:sort select="@STATCAT1" data-type="number" order="descending"/>
        </xsl:apply-templates>
    </xsl:copy>
        </xsl:template>

尝试:

<xsl:template match="Team">
    <xsl:copy>
        <xsl:apply-templates select="Player">
            <xsl:sort select="Stat[@name='STATCAT1']" data-type="number" order="descending"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>