probleme xsl

probleme xsl - XML/XSL - Programmation

Marsh Posté le 07-01-2009 à 23:06:12    

Bonjour,
 
J'ai ce xsl qui fonctionne bien.  Je souhaite limiter le xml résultant en limitant le nombre de noeuds <photo> en sortie (par exemple garder les 10 premières photos), mais je ne sais pas comment faire....  
Une idée ?
Merci d'avance

Citation :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output encoding="utf-8" omit-xml-declaration="yes"/>
 
   <xsl:template match="/">
      <tiltviewergallery>
         <photos>
            <xsl:apply-templates />
         </photos>
      </tiltviewergallery>
   </xsl:template>
 
   <xsl:template match="tiltviewergallery">
      <xsl:apply-templates select="/tiltviewergallery/photos/photo">
         <xsl:sort select="@imageurl" order="descending" />
      </xsl:apply-templates>
   </xsl:template>
 
 
   <xsl:template match="/tiltviewergallery/photos/photo">
       <photo imageurl="{@imageurl}">
      </photo>
   </xsl:template>
</xsl:stylesheet>


 
exemple de xml produit

Citation :

<tiltviewergallery>
 <photos>
  <photo imageurl="/phpgraphy-0.9.13a/pictures/2009-01-05 Lola/IMG_7646_resize.JPG"/>
  <photo imageurl="/phpgraphy-0.9.13a/pictures/2009-01-05 Lola/IMG_7639_resize.JPG"/>
  <photo imageurl="/phpgraphy-0.9.13a/pictures/2009-01-05 Lola/IMG_7637_resize.JPG"/>
  <photo imageurl="/phpgraphy-0.9.13a/pictures/2009-01-05 Lola/IMG_7636_resize.JPG"/>
 </photos>
</tiltviewergallery>
 

Reply

Marsh Posté le 07-01-2009 à 23:06:12   

Reply

Marsh Posté le 08-01-2009 à 09:30:02    

Utilise la fonction xpath position(), tu teste et tu limite à 10.

Reply

Marsh Posté le 08-01-2009 à 14:35:40    

avander a écrit :

Utilise la fonction xpath position(), tu teste et tu limite à 10.


 
j'ai rajouté "position () ", mais ça me ramène les 5 premiers AVANT tri alors que je voudrais les 5 premiers APRES tri... Je sèche completement....
 
 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output encoding="utf-8" omit-xml-declaration="yes"/>
 
   <xsl:template match="/">
      <tiltviewergallery>
         <photos>
            <xsl:apply-templates />
         </photos>
      </tiltviewergallery>
   </xsl:template>
 
   <xsl:template match="tiltviewergallery">
      <xsl:apply-templates select="/tiltviewergallery/photos/photo">
         <xsl:sort select="@imageurl" order="descending" />
      </xsl:apply-templates>
   </xsl:template>
 
   <xsl:template match="/tiltviewergallery/photos/photo[position() &lt; 5]">
      <photo imageurl="{@imageurl}">
      </photo>
   </xsl:template>
   
   <xsl:template match="/">
      <tiltviewergallery>
         <photos>
            <xsl:apply-templates />
         </photos>
      </tiltviewergallery>
   </xsl:template>
</xsl:stylesheet>

Reply

Marsh Posté le 09-01-2009 à 09:21:49    

Ton stylesheet est comment dire... assez brouillon.  
 
T'as plusieurs templates qui se tirent dans les pattes imho. Il te faut un template avec match="photo" je pense.

Reply

Marsh Posté le 09-01-2009 à 22:02:37    

avander a écrit :

Ton stylesheet est comment dire... assez brouillon.  
 
T'as plusieurs templates qui se tirent dans les pattes imho. Il te faut un template avec match="photo" je pense.


 
Oui je sais,  mais je patauge un peu avec ce xsl....
 
J'ai trouvé ceci à la place. Cela me semble mieux écrit et réponds à mon besoin... (mais je me demande si on peut faire mieux ? plus simple quoi ? t'en penses quoi avander ?)
 
Merci avander

Code :
  1. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  2.    <xsl:output encoding="utf-8" method="xml" indent="yes" />
  3.    <xsl:template match="/">
  4.       <tiltviewergallery>
  5.          <photos>
  6.             <xsl:for-each select="/tiltviewergallery/photos/photo">
  7.                <xsl:sort select="@imageurl" order="descending" />
  8.                <xsl:if test="(position()&lt;5)">
  9.                   <xsl:copy-of select="." />
  10.                </xsl:if>
  11.             </xsl:for-each>
  12.          </photos>
  13.       </tiltviewergallery>
  14.    </xsl:template>
  15. </xsl:stylesheet>

Reply

Marsh Posté le 11-01-2009 à 12:12:12    

Tant que ça marche...
 
Le xsl:for-each n'est pas fait pour ça, il sert à 'choper' des elements qui sont 'hors flux', des elements venus 'd'ailleurs' dont on a besoin alors qu'on est dans un template bien précis.
 
Perso, je ferais un template root dans lequel je fais un apply-templates vers les elements 'photo' avec le sort qui va bien et un template pour photo avec dedans le test.


Message édité par avander le 11-01-2009 à 12:12:44
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed