xml - XSLT 嵌套排序/for-each

标签 xml xslt xslt-1.0 msxml4

我正在尝试找出执行嵌套 for-each & 排序的最佳方法。例如,我下面的 XSLT 执行以下操作:

  1. 选择一个节点集。

  2. 按日期属性排序。

  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: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">

这样就需要单排序,直接得到感兴趣的五个节点。

关于xml - XSLT 嵌套排序/for-each,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3816109/

相关文章:

c# - 从 XHTML 文档中去除特定标签(但保留其内容)的机制?

html - 如何使用 xsl :if 选择正确的节点值

xml - 如何将值存储在数组中并稍后在 XSL 中使用它?

xslt-1.0 遍历固定值列表

xml - 为什么现代 Web 浏览器不支持 XSLT 2.0?

c# - 允许我查看/编辑请求 XML 的 WCF 测试客户端

java - java 中的 setPeekHeight() 没有给出与 xml 中相同的结果

c# - 将SQL XML参数中存储的一个byte[]存储到SQL Server 2005中的一个varbinary(MAX)字段中,可以吗?

xml - XSL 在 Google Chrome 中不起作用

xml - xpath/xslt相等检查多个值