2010-09-28 9 views
3

J'essaie de comprendre la meilleure façon d'effectuer un tri pour chaque & imbriqué. Par exemple mon XSLT ci-dessous effectue les opérations suivantes:XSLT imbriqué sort/pour-chaque

  1. Sélectionne un ensemble de nœuds. par attribut Date

  2. . Sortes

  3. Exécute la position() pour tirer 4 nœuds.

Maintenant, la partie suivante est ce que je suis en train de comprendre. Après l'étape 3, je dois à nouveau trier par l'attribut Date, mais cette fois dans l'ordre suivant ... maintenant que l'ensemble de données est réduit à 4 nœuds. Suggestions? Merci pour l'aide!!


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> 

NOTE: Ce devait être en XSLT 1.0 & est d'utiliser MSXML 4.0 Parser. Merci d'avance!

+0

Malheureusement, XSL 1.0 ne supporte pas beaucoup les types de données de date. – Oded

+0

Bonne question (+1). Voir ma réponse pour une solution simple et logique. :) –

+0

@Oded: Cette question est plus générale et a une bonne solution générale. Comme pour le type de données date, il semble que les valeurs de l'attribut '@ Date' (bien que non affichées) soient telles que le tri simple des chaînes fonctionne correctement avec eux (par exemple aaaa/mm/jj) –

Répondre

2

Au lieu de:

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

utilisation:

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

De cette façon, vous avez besoin d'un seul genre et obtenez directement aux cinq nœuds d'intérêt.

+0

+1 Très bonne réponse! Les quatre premiers dans l'ordre décroissant devraient être les quatre derniers dans l'ordre croissant. –

+0

Merci, cela a fonctionné parfaitement et était une excellente solution! Comme l'intervenant précédent l'a dit ... très bonne réponse! – OtoNoOto