在你的问题中,你要求的顺序与字母顺序一致,所以一个简单的<xsl:sort select="@result" />
应该可以正常工作。但在需要非字母固定排序的情况下,我倾向于使用以下技巧。
首先定义变量中的顺序,条目由不属于任何选项的某些字符分隔:
<xsl:variable name="sortOrder" select="'|Passed|Failed|Ignored|'" />
Then use
<xsl:sort data-type="number" select="string-length(
substring-before($sortOrder, concat('|', @result, '|')))" />
这里的技巧是substring-before($sortOrder, concat('|', @result, '|'))
将是空字符串,当@result
已通过,字符串"|Passed"
when @result
失败,并且字符串"|Passed|Failed"
when @result
被忽略。因此按数字排序length这些字符串将产生由下式给出的排序$sortOrder
.
在这种特殊情况下,您甚至不需要concat
, just
<xsl:sort data-type="number" select="string-length(
substring-before($sortOrder, @result))" />
会做这项工作。这concat
在一般情况下,是否可以处理排序中的一项是另一项的子字符串的情况。例如,对于订购'|Passed|Pass|Failed|Fail|'
concat 是必需的,否则“Pass”将被视为与“Passed”相同,而不是在其后一致排序。