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

这绝对是丑陋的,但可能是实现这一目标的更紧凑的方法之一:

  <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-templatesfor-each),这是次优的。

如果您真的不想这样做,您还可以创建一个包含排序键的节点集。这需要node-set()大多数实现(无论如何我都使用过)支持的扩展功能。

在 XPath 1.0 中有一个用于执行内联条件的构造:请参阅Tomalak 的这个答案。我自己没有使用过它,即使是在二元条件下,我也会担心任何将它用于三路条件的人。但这是你的电话。

于 2013-10-31T17:47:30.750 回答