Xslt 如果并非所有节点都具有该值,如何按数值对节点进行排序?
我有这样一个XML文档:Xslt 如果并非所有节点都具有该值,如何按数值对节点进行排序?,xslt,Xslt,我有这样一个XML文档: <?xml version="1.0" ?> <root> <element id="1"><name>Red</name><rank value="1" /></element> <element id="2"><name>Orange</name><rank value="4" /></element> <
<?xml version="1.0" ?>
<root>
<element id="1"><name>Red</name><rank value="1" /></element>
<element id="2"><name>Orange</name><rank value="4" /></element>
<element id="3"><name>Yellow</name><rank value="3" /></element>
<element id="4"><name>Green</name><rank value="2" /></element>
<element id="5"><name>Blue</name><rank value="5" /></element>
<element id="6"><name>Indigo</name></element>
<element id="6"><name>Violet</name></element>
</root>
红色
橙色
黄色的
绿色
蓝色
靛蓝
紫罗兰色
我希望按数字等级排序,并将未排序的元素浮动到底部,如下所示:
<?xml version="1.0" ?>
<root>
<element id="1"><name>Red</name><rank value="1" /></element>
<element id="2"><name>Orange</name><rank value="4" /></element>
<element id="3"><name>Yellow</name><rank value="3" /></element>
<element id="4"><name>Green</name><rank value="2" /></element>
<element id="5"><name>Blue</name><rank value="5" /></element>
<element id="6"><name>Indigo</name></element>
<element id="6"><name>Violet</name></element>
</root>
- 红色的
- 绿色的
- 黄色的
- 橙色的
- 蓝色的
- 靛蓝
- 紫罗兰色
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<xsl:apply-templates select="element">
<xsl:sort select="rank/@value" data-type="number" order="ascending" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="element">
<xsl:text>* </xsl:text><xsl:apply-templates select="name" /><xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
*
但我的输出如下所示:
<?xml version="1.0" ?>
<root>
<element id="1"><name>Red</name><rank value="1" /></element>
<element id="2"><name>Orange</name><rank value="4" /></element>
<element id="3"><name>Yellow</name><rank value="3" /></element>
<element id="4"><name>Green</name><rank value="2" /></element>
<element id="5"><name>Blue</name><rank value="5" /></element>
<element id="6"><name>Indigo</name></element>
<element id="6"><name>Violet</name></element>
</root>
- 靛蓝
- 紫罗兰色
- 红色的
- 绿色的
- 黄色的
- 橙色的
- 蓝色的
事实上,所有排名项目都是按顺序排列的,但它们位于列表的底部。经过一点修改后回答了我自己的问题 因为我使用的是数字排序标准,所以我可以排序
降序
,而不是升序
,然后翻转正在排序的数字参数的符号:
<xsl:apply-templates select="element">
<xsl:sort select="-(rank/@value)" data-type="number" order="descending" />
</xsl:apply-templates>
这将给出所需的顺序:
- 红色的
- 绿色的
- 黄色的
- 橙色的
- 蓝色的
- 靛蓝
- 紫罗兰色
<xsl:template match="/root">
<xsl:apply-templates select="element">
<xsl:sort select="number(boolean(rank/@value))" data-type="number" order="descending" />
<xsl:sort select="rank/@value" data-type="number" order="ascending" />
</xsl:apply-templates>
</xsl:template>
请参阅说明:哦,我真的很喜欢这样:先按值的存在情况排序,然后按值的等级排序。我接受这个答案,因为我认为它比我的更聪明,而且可以处理非数字数据。