2

私は使用しています

<xsl:sort />

テーブル内の行をソートします。の値

@result 

Failed、Ignored、または Passed のいずれかです。アルファベット順にソートされているため、希望する順序で表示されません。どれが

失敗 - 無視 - 合格

xslt 1.0を使用していますこれを達成するにはどうすればよいですか

これは私のコードです

<xsl:apply-templates select="results/test-case">
<xsl:sort select="@result" /> 
</xsl:apply-templates>
4

3 に答える 3

9

あなたの質問では、あなたが求めた順序はアルファベット順と一致しているため、プレーン<xsl:sort select="@result" />は正しく機能するはずです。ただし、アルファベット以外の固定順序が必要な場合は、次のトリックを使用する傾向があります。

最初に変数の順序を定義します。エントリは、オプションの一部ではない文字で区切られます。

<xsl:variable name="sortOrder" select="'|Passed|Failed|Ignored|'" />

次に使用します

<xsl:sort data-type="number" select="string-length(
    substring-before($sortOrder, concat('|', @result, '|')))" />

ここでのコツは、が Passed のsubstring-before($sortOrder, concat('|', @result, '|'))場合は空の文字列、Failed の場合は文字列、 Ignoredの場合は文字列になることです。したがって、これらの文字列の長さで数値的にソートすると、 で与えられる順序が生成されます。@result"|Passed"@result"|Passed|Failed"@result$sortOrder

concatこの特定のケースでは、必要さえありません。

<xsl:sort data-type="number" select="string-length(
    substring-before($sortOrder, @result))" />

仕事をします。はconcat、一般に、順序付けの 1 つの項目が別の項目の部分文字列である状況を処理するためにあります。たとえば'|Passed|Pass|Failed|Fail|'、連結の順序付けが必要な場合、「合格」はその後で一貫してソートされるのではなく、「合格」と同じように扱われます。

于 2013-11-05T11:40:00.290 に答える