Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 如果并非所有节点都具有该值,如何按数值对节点进行排序?_Xslt - Fatal编程技术网

Xslt 如果并非所有节点都具有该值,如何按数值对节点进行排序?

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文档:

<?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>

请参阅说明:


哦,我真的很喜欢这样:先按值的存在情况排序,然后按值的等级排序。我接受这个答案,因为我认为它比我的更聪明,而且可以处理非数字数据。