2010-10-27 6 views
2

Il est supposé être très simple, Je veux limiter mes résultats dans ce for-each mais aussi vouloir vérifier un nœud. Pour une raison quelconque, cela ne fonctionne pas en les combinant dans une seule déclaration?XSLT: pour chaque problème

J'ai une case à cocher (recommandée) qui peut être cochée à 'Oui'. Lorsque je supprime la limite 5 dans le pour-chaque, il affiche tous les éléments qui ont recommandé sur 'Oui'. Lorsque je supprime le 'recommended =' Yes ​​'du test pour chaque, les derniers éléments sont limités jusqu'à 5. Les mettre ensemble ne donne rien. Ils ne fonctionnent plus tous les deux. Je veux les filtrer sur recommandé « Oui » et je veux les limiter à 5.

<xsl:for-each select="data/resorts/entry[position() &lt; 2 and recommended = 'Yes']"> 
    <xsl:sort select="top-pick-order" case-order="upper-first"/> 
     <a href="{$root}/koh-lipe-resorts/resort-view/{resort-name/@handle}"> 
      <div id="top-pick-item"> 
       <div id="top-pick-text-short"> 
        <h3 class="item-heading"><xsl:value-of select="resort-name"/></h3> 
        <p> 
         <xsl:call-template name="truncate"> 
          <xsl:with-param name="value" select="resort-description" mode="formatted"/> 
          <xsl:with-param name="length" select="110" /> 
         </xsl:call-template> 
        </p> 
       </div> 
      </div> 
     </a> 
</xsl:for-each> 
+0

Veuillez inclure un échantillon de l'entrée XSLT (y compris les nœuds correspondants et non correspondants). Décrivez également le résultat que vous obtenez et ce que vous attendez. Comme il brin cette question ne contient pas assez d'informations pour vous aider. – Richard

+0

Très bien édité – Sandor

+0

Bonne question, +1. Voir ma réponse pour une explication et une solution complète. :) –

Répondre

5
<xsl:for-each select= 
    "data/resorts/entry[position() &lt; 6 
    and 
    recommended = 'Yes']"> 

Cela permet de sélectionner tous les éléments data/resorts/entry parmi les deux premiers, qui ont également un attribut recommended avec valeur 'Yes'.

Mais vous voulez:

data/resorts/entry[recommended = 'Yes'][position() &lt; 6] 

cette expression précise d'abord tousdata/resorts/entry éléments et les limite seulement à ceux dont la position dans le nœud liste déjà obtenue est inférieure à 6.

Rappelez-vous: La fonction position() est contextuelle et ne peut pas être déplacée librement une expression sans changer de sens!

+0

+1 Bonne réponse. –

+0

Merci Dimitre pour l'explication et la solution! ça fonctionne parfaitement maintenant. – Sandor

0

Puisque vous n'avez pas fourni quelques exemples de données mais je ne peux que supposer que recommended est un attribut de <entry />. Dans ce cas, vous devez avoir @recommended dans votre instruction select:

<xsl:for-each select="data/resorts/entry[position() &lt; 2 and @recommended = 'Yes']">