使用 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>
我在 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>