1

変数の内容に従って並べ替えを実行する必要がある状況があります。

XSLT 2.0 では、次のことを行います。

<xsl:sort select=" 
        if ($column = 'name') then name
        else if ($column = 'score') then count(//scores/score[@id=current()/@id])
        else if ($column = 'rating) then count(//ratings/rating[@id=current()/@id])
        else name"
        order={$sort}" />

しかし、バージョン 1.0 で行う必要があり、代替手段が見つかりません。どうすればいいですか?

4

3 に答える 3

3

複数のソート キーを定義し、それらのいくつかを無効にすることができます (すべてのノードにそのソート キーに同じ値を与えることにより)。

<xsl:sort select="name[$column = 'name']"/>
<xsl:sort select="count(/self::node()
          [$column = 'score']/scores/score[@id=current()/@id])"/>
<xsl:sort select="count(/self::node()
          [$column = 'rating']/ratings/rating[@id=current()/@id])"/>
<xsl:sort select="name"/> 
于 2013-10-31T23:36:06.370 に答える
1

これは間違いなく醜いですが、これを実現するためのよりコンパクトな方法の1つかもしれません:

  <xsl:key name="score" match="scores/score" use="@id" />
  <xsl:key name="rating" match="ratings/rating" use="@id" />

  <!-- ... -->

  <xsl:variable name="useName" 
                select="$column != 'score' and $column != 'rating'" />
  <xsl:apply-templates select="something">
    <xsl:sort order="{$sort}" 
              data-type="{substring('numbertext', 1 + 6 * $useName, 6)}"
              select="concat(
                         substring(count(key('score', @id])), 1, 
                                   100 * ($column = 'score')),
                         substring(count(key('rating', @id])), 1, 
                                   100 * ($column = 'rating')),
                         substring(name, 1, 100 * $useName)
                      )"
              />
  </xsl:apply-templates>
于 2013-10-31T18:14:38.677 に答える
0

XSLT 1.0 でこの状況が発生した場合、xsl:choose. もちろん、これはソートしているもの (apply-templatesまたはfor-each) を繰り返さなければならないことを意味しますが、これは最適ではありません。

本当にそうしたくない場合は、ソート キーを含むノード セットを作成することもできます。これには、ほとんどの実装でサポートされている拡張機能が必要node-set()です (とにかく私が使用したものです)。

XPath 1.0 でインライン条件を実行するための構造があります。Tomalak からのこの回答を参照してください。私自身は、2 値条件でも使用したことがありません。また、3 方向条件で使用した人がいると心配です。しかし、それはあなたの電話です。

于 2013-10-31T17:47:30.750 に答える