recherche dans un document xml avec xsl

recherche dans un document xml avec xsl - XML/XSL - Programmation

Marsh Posté le 14-07-2006 à 16:11:24    

Hello,
 
je voudrai pouvoir rechercher dans un document xml selon un critère alphabétique et ceci en utilsant xsl.
 
exemple :
 
<a>
<b>abcd</b>
</a>
 
<a>
<b>zbcd</b>
</a>
 
je voudrai pouvoir récupérer abcd
 
merci


Message édité par weblook$$ le 14-07-2006 à 16:12:00
Reply

Marsh Posté le 14-07-2006 à 16:11:24   

Reply

Marsh Posté le 14-07-2006 à 17:43:43    

J'ai cherché un petit peu et ça donne:

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:output method="xml" media-type="text/html; charset=UTF-8"/>
  4. <xsl:template match="/">
  5.  <html>
  6.   <head></head>
  7.   <body>
  8.    <ol>
  9.     <!-- Première méthode -->
  10.     <xsl:apply-templates select="//a/b" >
  11.      <xsl:sort select="text()"/>
  12.     </xsl:apply-templates>
  13.     <!-- Deuxième méthode -->
  14.     <!--
  15.     <xsl:for-each select="//a">
  16.      <xsl:sort select="b/text()"/>
  17.      <xsl:apply-templates />
  18.     </xsl:for-each> 
  19.     -->
  20.    </ol>
  21.   </body>
  22.  </html>
  23. </xsl:template>
  24. <xsl:template match="b">
  25.  <li><xsl:apply-templates /></li>
  26. </xsl:template>
  27. </xsl:stylesheet>


Le seul problème est que je n'ai pas réussi à retourner seulement le premier de la liste résultat

Reply

Marsh Posté le 14-07-2006 à 17:50:47    


Code :
  1. <xsl:for-each select="//a">
  2.      <xsl:sort select="b/text()"/>
  3. <xsl:if test='position() = 1'>
  4. <xsl:apply-templates />
  5. </xsl:if>
  6.     </xsl:for-each>


Ca peut marcher mais c'est pas forcement genial (dans le sens ou ton obtenir ton resultat il y a surement une meilleur methode)


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 14-07-2006 à 19:00:25    

j'ai oublié de préciser, je souhaiterai pouvoir spécifier la première lettre lors du critère de recherche. Par exemple : obtenir le premier Noeud <b> dont le texte commence par la lettre 'F'.

Reply

Marsh Posté le 14-07-2006 à 19:02:14    

oublié de préciser ou mal exprimé ce que je voulais obtenir plutôt


Message édité par weblook$$ le 14-07-2006 à 19:09:44
Reply

Marsh Posté le 14-07-2006 à 20:18:17    

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:output method="xml" media-type="text/html; charset=UTF-8"/>
  4. <xsl:template match="/">
  5.  <html>
  6.   <head></head>
  7.   <body>
  8.    <ol>
  9.     <xsl:variable name="cible">F</xsl:variable>
  10.     <xsl:apply-templates select="//b[starts-with(text(),$cible)]" >
  11.      <xsl:sort select="text()"/>
  12.     </xsl:apply-templates>
  13.    </ol>
  14.   </body>
  15.  </html>
  16. </xsl:template>
  17. <xsl:template match="b">
  18.  <xsl:if test="position() = 1">
  19.   <li>[<xsl:value-of select="position()"/>] <xsl:apply-templates /></li>
  20.  </xsl:if>
  21. </xsl:template>
  22. </xsl:stylesheet>


Mais le <xsl:if> me laisee perplexe, j'etais persuadé que l'on pouvait utiliser des trucs du genre:

Code :
  1. <xsl:template match="b[1]">
  2. </xsl:template>
  3. ou
  4. <xsl:template match="b[position() = 1]">
  5. </xsl:template>


Reply

Marsh Posté le 14-07-2006 à 20:55:35    

tu peux


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 14-07-2006 à 21:40:30    

bon en faite je m'apperçois que c'est pas exactement ça que je recherche. Pour tout vous dire, j'ai une liste de mot allant de A à Z et je voudrais avoir une rangé de lettre en haut de la page html générée (A B C etc..) qui serait des liens vers le premier mot ayant sa première lettre correspondante à la lettre sur laquelle l'utilisateur a cliqué. je crois qu'il faut que j'utilise du JScript pour ça ou un truc du genre ça devient chaud.

Message cité 1 fois
Message édité par weblook$$ le 14-07-2006 à 21:46:24
Reply

Marsh Posté le 14-07-2006 à 22:58:29    

Code :
  1. <script language="text/javascript"><![CDATA[
  2. function sel(lettre){
  3. var XSLSource = new Object();         
  4. var XMLSource = new Object();
  5. XMLSource = document.XMLDocument;
  6. XSLSource = document.XSLDocument;
  7. XMLsource.documentElement.selectNodes(//b[starts-with(text(),lettre)]);
  8. document.body.innerHTML = XMLsource.transformNode(XSLsource)
  9. }
  10. ]]></script>


 
Une fois un noeud sélectionné comment faire pour l'exploiter ? dans mon cas ça serait déplacer la scrollbar jusqu'à rendre visible le texte correspondant à ce noeud.


Message édité par weblook$$ le 14-07-2006 à 22:59:23
Reply

Marsh Posté le 15-07-2006 à 03:33:38    

weblook$$ a écrit :

bon en faite je m'apperçois que c'est pas exactement ça que je recherche. Pour tout vous dire, j'ai une liste de mot allant de A à Z et je voudrais avoir une rangé de lettre en haut de la page html générée (A B C etc..) qui serait des liens vers le premier mot ayant sa première lettre correspondante à la lettre sur laquelle l'utilisateur a cliqué. je crois qu'il faut que j'utilise du JScript pour ça ou un truc du genre ça devient chaud.


 
J'aurais bien une solution mais elle est peut être un peu crade :  
tu fais 1 template pour tes mots, mais tu fais 26 appels de ton template comme ça :  
 

Code :
  1. <xsl:apply-templates select='monNoeud &gt;= a and monNoeud &lt; b'/>
  2. <xsl:apply-templates select='monNoeud &gt;= b and monNoeud &lt; c'/>
  3. ...
  4. <xsl:apply-templates select='monNoeud &gt;= k and monNoeud &lt; l'/>
  5. etc...


et tu fais ton menu avec les liens à la main
 
Il y a surement mieux, mais c'est comme ça que j'avais fais pour grouper des élements.


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 15-07-2006 à 03:33:38   

Reply

Marsh Posté le 15-07-2006 à 21:29:14    


bon j'ai enfin réussi à obtenir ce que je voulais:
 
solution (super propre bien sûr, et ne marche que sur IE svp) :
 

Code :
  1. <script language="javascript"><![CDATA[
  2. var XSLSource = new Object();         
  3. var XMLSource = new Object();
  4. XMLSource = document.XMLDocument;
  5. XSLSource = document.XSLDocument;
  6. function writeHref(lettre)
  7. {
  8. var num = new Array();
  9. var i =0;
  10. var lg = 0;
  11. var href = 0;
  12. node = XMLSource.selectNodes("//mot-anglais" );
  13. lg= node.length;
  14. for(i=0;i<lg;i++)
  15. {
  16.  num[i] = node[i].text;
  17. }
  18. num = num.sort();
  19. for(i=0;i<lg;i++)
  20. {
  21.  if(num[i].charAt(0) == lettre )
  22.  {
  23.   href = i;
  24.   break;
  25.  }
  26. }
  27. if(href != 0 )
  28. {
  29.      if (document.getElementById)
  30.      {
  31.   document.getElementById(lettre).href = "#"+href;
  32.      }
  33.      else if (document.all)
  34.      {
  35.      document.all[lettre].href = "#"+href;
  36.      }
  37.    
  38. }
  39. }
  40. ]]>
  41. </script>


Code :
  1. <a id="a" onClick="javascript:writeHref('a');" href="#">A</a>
  2. 26 liens de ce type


Code :
  1. <xsl:element name="a">
  2.          <xsl:attribute name="name">
  3.              <xsl:value-of select="position()" />
  4.          </xsl:attribute>              
  5.     <b><font color="blue"><xsl:apply-templates select="mot-anglais"/></font></b>
  6.         </xsl:element><br/>


 
 
et on définit des liens cible  pour chaque lettre

Reply

Marsh Posté le 15-07-2006 à 21:30:44    

et bien sûr avant le dernier bout de code je trie les éléments      
 
 <xsl:apply-templates select="vocabulaires/mot">
       <xsl:sort select="mot-anglais" order="ascending"/>
     </xsl:apply-templates>

Reply

Sujets relatifs:

Leave a Replay

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