2010-09-28 50 views
3

我想弄清楚執行嵌套的每個&排序的最佳方法。例如,我的XSLT執行以下操作:XSLT嵌套排序/爲每個

  1. 選擇節點集。

  2. 按日期排序屬性。

  3. 執行位置()拉4個節點。

現在,接下來的部分是什麼,我想弄清楚。在步驟3之後,我需要再次按日期屬性排序,但是這次按升序排列......現在數據集被縮小爲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分析器。提前致謝!

+0

不幸的是XSL 1.0沒有太多支持日期數據類型。 – Oded 2010-09-28 19:07:31

+0

好問題(+1)。看到我的答案是一個簡單而合理的解決方案。 :) – 2010-09-28 19:11:44

+0

@Oded:這個問題更一般,有一個很好的通用解決方案。至於日期數據類型,似乎'@ Date'屬性的值(雖然沒有顯示)是這樣的,簡單的字符串排序對它們正確工作(例如yyyy/mm/dd) – 2010-09-28 19:14:10

回答

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

通過這種方式,你需要一個排序,並直接獲取到感興趣的五個節點。

+0

+1非常好的答案!按升序排列的前四位應該是最後四位。 – 2010-09-28 19:40:54

+0

謝謝,這工作完美&是一個偉大的解決方案!正如前面的評論者所說......非常好的答案! – OtoNoOto 2010-09-29 09:44:52