根据XSLT中的变量对列表进行排序的不同方式

根据XSLT中的变量对列表进行排序的不同方式,xslt,sorting,Xslt,Sorting,我正在制作一个新闻列表,到目前为止,我已经在他们约会之后对新闻进行了分类。最新的第一 但我想给网站管理员一个更灵活的解决方案。这意味着在后端,管理员可以从下拉列表中进行选择,以他/她希望的方式对列表进行排序。按日期最新优先和最老优先,或按标题A-Z和Z-A。这意味着4种可能的方法是正确的 现在我有以下XSLT: <xsl:variable name="alleNyheder" select="$currentPage//node" /> <xsl:variab

我正在制作一个新闻列表,到目前为止,我已经在他们约会之后对新闻进行了分类。最新的第一

但我想给网站管理员一个更灵活的解决方案。这意味着在后端,管理员可以从下拉列表中进行选择,以他/她希望的方式对列表进行排序。按日期最新优先和最老优先,或按标题A-Z和Z-A。这意味着4种可能的方法是正确的

现在我有以下XSLT:

    <xsl:variable name="alleNyheder" select="$currentPage//node" />

    <xsl:variable name="sort">
        <news>
            <xsl:for-each select="$alleNyheder[@template='1092']">
                <news>
                    <id>
                        <xsl:value-of select="./@id"></xsl:value-of>
                    </id>
                    <date>
                        <xsl:choose>
                            <xsl:when test="./data[@alias='date'] != ''">
                                <xsl:value-of select="./data[@alias='date']"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:value-of select="./@createDate"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </date>
                </news>

            </xsl:for-each>
        </news>
    </xsl:variable>

    <xsl:for-each select="msxml:node-set($sort)/news/news">
        <xsl:sort data-type="text" select="date" order="descending" />

        ---- My newsitems ----
    </xsl:for-each>
因此,现在我在变量$sort中的日期值之后对列表进行排序

如果我将$sort中的日期字段改为titles而不是date,我实际上可以在新闻标题之后对列表进行排序。但不幸的是,它应该按升序排序,而不是按降序排序。我不知道如何像在select值中那样动态更改order值

如果这对任何人都有帮助,我正在开发Umbraco CMS

谢谢

-金姆


另一方面,你真的应该调查并避免。通过这种方式,您的代码变得更清晰、更地道。我还确信,整个临时节点集业务是完全可以避免的。

Hmm..是的,也许我应该尝试应用模板。但是代码会是什么样子呢?我的意思是,我应该把排序放在哪里?应用模板也可以包含排序。无论如何,这可能会导致对脚本进行重大重写,但完成后代码会更好。注意:在没有看到输入XML的情况下,我真的无法建议如何更改代码。我现在已经阅读了一些关于应用模板的不同内容,我可以看到,实际上我几乎可以更改我的for each,以使用相同的select应用模板。然后使用param关闭一些,并将我的内容从中放到一个新模板中。所以我明天会试一试。当我这样做的时候,有什么具体的事情我应该知道吗?顺便说一下,我也接受你的正确答案:谢谢。好吧,试试看。如果你有问题,你知道去哪里问-
<xsl:choose>
  <xsl:when test="$sortfield = 'date' and $sortorder = 'D'>
    <xsl:for-each select="msxml:node-set($sort)/news/news">
      <xsl:sort data-type="text" select="date" order="descending" />
      <!-- ... -->
    </xsl:for-each>
  </xsl:when>
  <xsl:when test="$sortfield = 'date' and $sortorder = 'A'>
    <xsl:for-each select="msxml:node-set($sort)/news/news">
      <xsl:sort data-type="text" select="date" order="ascending" />
      <!-- ... -->
    </xsl:for-each>
  </xsl:when>
  <!-- ... -->
</xsl:choose>