XSLT嵌套排序/ for-each

时间:2010-09-28 18:58:54

标签: xml xslt xslt-1.0 msxml4

我正在试图找出执行嵌套for-each和amp;的最佳方法。分类。例如,我的XSLT执行以下操作:

  1. 选择节点集。

  2. 按日期排序属性。

  3. 执行position()以拉出4个节点。

  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&amp;正在使用MSXML 4.0 Parser。提前致谢!

1 个答案:

答案 0 :(得分: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">

通过这种方式,您需要进行单一排序,直接获取感兴趣的五个节点。