XSLT 中是否可以按字母顺序排序,其中 5 项为“首选”。
即给定
<teams>
<team id="142" name="Scotland" />
<team id="110" name="Liverpool" />
<team id="13" name="Manchester United" />
<team id="123" name="England" />
<team id="84" name="Chelsea" />
<team id="295" name="Wales" />
<team id="49" name="Arsenal" />
<team id="126" name="Northern Ireland" />
<team id="121" name="Republic of Ireland" />
<team id="42" name="Manchester City" />
<team id="298" name="Tottenham Hotspur" />
<team id="299" name="Bolton" />
</teams>
我要求首先按一定顺序对国家队进行排序,然后按字母顺序排列其余球队:
<teams>
<team id="123" name="England" />
<team id="126" name="Northern Ireland" />
<team id="121" name="Republic of Ireland" />
<team id="142" name="Scotland" />
<team id="295" name="Wales" />
<team id="49" name="Arsenal" />
<team id="299" name="Bolton" />
<team id="84" name="Chelsea" />
<team id="110" name="Liverpool" />
<team id="42" name="Manchester City" />
<team id="13" name="Manchester United" />
<team id="298" name="Tottenham Hotspur" />
</teams>
我一直在努力,但失败了。
有没有一种巧妙的方法可以做到这一点,或者您必须对国家队进行单独排序,然后再进行排除所有国家队的排序?
Tim C 已经给出了一个很好的答案,但也许一个更简单的方法就足以满足您的情况。您可以简单地指定两个xsl:sort
条件:第一个将按首选/非首选项目排序,第二个将按名称字母顺序排序:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/teams">
<teams>
<xsl:for-each select="team">
<xsl:sort select="not(@name = 'England' or @name='Northern Ireland'
or @name='Republic of Ireland'
or @name='Scotland' or @name='Wales')"
data-type="number"/>
<xsl:sort select="@name"/>
<team>
<xsl:value-of select="@name"/>
</team>
</xsl:for-each>
</teams>
</xsl:template>
</xsl:stylesheet>
请注意,您必须使用以下命令反转第一个条件not()
。原因是表达式的布尔结果被转换为数字(0 为假,1 为真),因此评估为“假”的项目将首先列出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)