XSLT嵌套排序/ for-each

3

我正在尝试找出执行嵌套的for-each和排序的最佳方法。例如,我的XSLT如下所示:

  1. 选择节点集。

  2. 按Date属性排序。

  3. 执行position()以提取4个节点。

现在,接下来的部分是我正在努力解决的。在第3步之后,我需要再次按Date属性排序,但这次是按升序排序...现在数据集已经缩小到4个节点。有什么建议吗?感谢您的帮助!


XSLT:

  <xsl:template name="AdmissionsNewsList">
    <ul class="stories-list">
      <xsl:for-each select="AdmissionsSectionFront/TaxonomyNavigation[@Name='AdmissionsNewsList']/Category/Pages/Page">
        <xsl:sort select="@Date" order="descending" />
              <xsl:if test="position() &lt; 5">

                    <!-- NOW THAT THE NODES HAVE BEEN SELECTED, SORTED, AND POSTION LIMIT SET
                         I NEED TO PERFORM ANOTHER SORT BY DATE (ASCENDING ORDER) HERE ON THE NARROWED DOWN DATA SET -->

                            <li>
                              <xsl:choose>
                                  <xsl:when test="normalize-space(@ThumbnailImage)">
                                      <img alt="{@LocalAlternateText}" src="images/{@ThumbnailImage}" />
                                  </xsl:when>
                                  <xsl:otherwise>
                                      <img alt="{@LocalAlternateText}" src="images/News%20Photos/Default.jpg"/>
                                  </xsl:otherwise>
                              </xsl:choose>
                              <div>
                                <h5>
                                  <xsl:value-of select="@Title"/>
                                </h5>
                                <br/>
                                <xsl:apply-templates select="@Abstract"/>
                                <br/><br/>
                                <a href="{@URL}" class="full-story">
                                  <xsl:apply-templates select="Page[@Name='Link']/@Target"/>Full Story
                                </a>
                              </div>
                            </li>

              </xsl:if> 
      </xsl:for-each>
    </ul>
  </xsl:template>

注意:这必须是XSLT 1.0,并且使用MSXML 4.0解析器。提前致谢!


很遗憾,XSL 1.0 对日期数据类型的支持不太好。 - Oded
好问题(+1)。看看我的答案,有一个简单而逻辑的解决方案。 :) - Dimitre Novatchev
@Oded:这个问题更为一般,有一个不错的通用解决方案。至于日期数据类型,似乎@Date属性的值(虽然未显示)是那种简单字符串排序可与之正确工作的格式(例如yyyy/mm/dd)。 - Dimitre Novatchev
@Dimitre - 如果它们确实是那种格式的字符串,我同意。我不幸地看到过dd/MMM/yyyy和其他不太容易处理的变体... - Oded
1个回答

2

替代方案:

  <xsl:for-each select=
    "AdmissionsSectionFront/TaxonomyNavigation
                    [@Name='AdmissionsNewsList']/Category/Pages/Page">
    <xsl:sort select="@Date" order="descending" />
          <xsl:if test="position() &lt; 5">

用途:

  <xsl:variable name="vNewAdmPages" select=
    "AdmissionsSectionFront/TaxonomyNavigation
                    [@Name='AdmissionsNewsList']/Category/Pages/Page">
  "/>
  <xsl:for-each select="$vNewAdmPages">
    <xsl:sort select="@Date" order="ascending" />
          <xsl:if test="position() > count($vNewAdmPages) -5">

以这种方式,您只需要进行一次排序,就可以直接访问五个感兴趣的节点。

+1 非常好的答案!前四个按降序排列应该是后四个按升序排列。 - user357812
谢谢,这个解决方案完美地运行了!正如之前的评论者所说...非常好的答案! - seanrco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接