2010-07-24 4 views
0

Je suis en train de coder mon premier site web en utilisant XML + XSL. Le xml Je transformais ont cette section:Comment puis-je sélectionner le premier élément d'un noeud avec XSL?

<page> 
    <news> 
     <highlights> 
      <entry> 
       <mini>x_thumb.jpg</mini> 
       <title>title</title> 
       <text>text</text> 
       <image>x.jpg</image> 
       <link>x.html</link> 
      </entry> 
      <entry> 
       <mini>z_thumb.jpg</mini> 
       <title>title</title> 
       <text>text</text> 
       <image>z.jpg</image> 
       <link>z.html</link> 
      </entry> 
      <entry> 
       <mini>y_thumb.jpg</mini> 
       <title>title</title> 
       <text>text</text> 
       <image>y.jpg</image> 
       <link>y.html</link> 
      </entry> 
     </highlights> 
    </news> 
</page> 

Dans mon fichier .xsl je veux choisir la première entrée parce que je fais un rotateur d'image jQuery et j'ai besoin de l'image « par défaut » pour afficher il. Donc, j'ai codé:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
     [...] 

     <xsl:template match="page/news/highlights/entry[1]"> 
      <div class="main_image"> 
       <img> 
        <xsl:attribute name="src"> 
         <xsl:value-of select="image" /> 
        </xsl:attribute> 
        <xsl:attribute name="alt"> 
         <xsl:value-of select="title" /> 
        </xsl:attribute> 
       </img> 
       <div class="desc"> 
        <div class="block"> 
         <p> 
          <xsl:value-of select="text" /> 
         </p> 
        </div> 
       </div> 
      </div> 
     </xsl:template> 
[...] 

Et je ne peux pas le faire fonctionner. J'ai essayé de diverses manières, comme:

<xsl:value-of select="page/news/highlights/entry[1]/image" /> 

Un moyen ... Comment puis-je le faire?

Merci d'avance!

+0

Ne vous voulez sélectionner toutes les entrées et cacher tout, mais le premier avec jQuery? Qu'allez-vous faire différemment avec le premier élément? – Eric

+0

Je reproduisais: http://designm.ag/tutorials/image-rotator-css-jquery/ mais avec dejavu réponds maintenant je le fais fonctionner! Merci! :) – ipalaus

+2

Vous parlez toujours de "ça" ("Je ne peux pas le faire fonctionner", "Comment puis-je le faire?") Sans définir clairement ce que "c'est". Ne présumez pas que les gens connaissent ou se soucient du fonctionnement interne du plugin d'image jQuery que vous utilisez. Juste montrer la sortie désirée sera suffisant pour les questions XSLT. * PS: Aussi, s'il vous plaît, publiez un exemple de code syntaxiquement légal la prochaine fois. Cela aidera les gens à reproduire votre problème sans avoir à le deviner. * – Tomalak

Répondre

2
<xsl:template match="/"> 
    <!-- [...] --> 

    <!-- show first entry only --> 
    <xsl:apply-templates select="page/news/highlights/entry[1]" /> 
</xsl:template> 

<!-- generic template to handle <entry> elements --> 
<xsl:template match="entry"> 
    <div class="main_image"> 
    <!-- Attribute Value Templates save many lines of code --> 
    <img src="{image}" alt="{title}" /> 
    <div class="desc"> 
     <div class="block"> 
     <p><xsl:value-of select="text" /></p> 
     </div> 
    </div> 
    </div> 
</xsl:template> 
+0

Désolé Tomalak pour ma mauvaise expression. Comme vous pouvez le voir, l'anglais n'est pas ma langue principale. Je suis désolé pour la confusion que j'ai causée. Je dois dire que votre réponse m'a beaucoup aidé et c'est ce que j'utilise. Je vous remercie! – ipalaus

+0

@Isem: Pas besoin de ne pas m'excuser. Vous devriez avoir corrigé votre question à la place. – Tomalak

+0

Vous pouvez également faire correspondre la première entrée 'match' comme l'entrée' match = "[1]" 'et remplacer les noeuds de texte avec une règle vide pour compacter le code. –

1
<xsl:value-of select="page/news/highlights/entry[position() = 1]/image" /> 
+0

Ça a marché! Merci dejavu – ipalaus

+5

@Isem Palaus: Si cela a fonctionné, alors vous aviez autre chose d'incorrect. Voir http://www.w3.org/TR/xpath/#path-abbrev et dans la section 2.4, "Ainsi un chemin de localisation' para [3] 'est équivalent à' para [position() = 3] '" –

1

Vous voulez quelque chose comme ça?

<xsl:foreach select="page/news/highlights/entry"> 
    <div> 
     <xsl:if test="position() = 1"> 
      <xsl:attribute name="class">main_image</xsl:attribute> 
     </xsl:if> 
     <img> 
      <xsl:attribute name="src"> 
       <xsl:value-of select="image" /> 
      </xsl:attribute> 
      <xsl:attribute name="alt"> 
       <xsl:value-of select="title" /> 
      </xsl:attribute> 
     </img> 
     <div class="desc"> 
      <div class="block"> 
       <p> 
        <xsl:value-of select="text()" /> 
       </p> 
      </div> 
     </div> 
    </div> 
</xsl> 
Questions connexes