A l'aide - pbm de comptage et de manipulation de chaines

A l'aide - pbm de comptage et de manipulation de chaines - XML/XSL - Programmation

Marsh Posté le 18-04-2006 à 16:31:24    

Bonjour, j'ai un problème de codage, à partir d'un fichier XML donné en 'annexe 1' (extrait) je veux generé un fichier du type 'annexe2' qui contient des appel à des fonctions en javascript pour créer des menus sur une page html (menu que je veux créer automatiquement)
 
Mon fichier xsl est donné en 'annexe3', je n'ai pas de probleme pour créer les 'menu.addParent' (repertoires d'un disque dur) ni les 'menu.addChild' (fichiers sur le disque dur) mais pour l'instant je n'arrive pas a créer les 'menu.addSousParent' qui sont des sous-repertoires du dique dur
 
En fait je n'arrive pas a faire la distinction entre un repertoire et un sous repertoire (voir ligne 2 de annexe 1)
 
il faudrait que j'arrive a compter les '\' ??? !!! mais comment
 
Derniere info : je ne peut pas modifier le XML, il est généré automatiquement
 
Merci pour toute aide !
 
ANNEXE 1 :
 
<dir>
<id>1</id><name>mecanique</name><fullname>l:\TRAVAIL\BTS_CPI\mecanique</fullname>
<file>
<id>2</id>
<extension>sdw</extension>
<name>A4_Meca.sdw</name>
<fullname>l:\TRAVAIL\BTS_CPI\mecanique\A4_Meca.sdw</fullname>
<shortname>A4_Meca.sdw</shortname>
<size>16896</size>
<attributes>a</attributes>
<datetime>
<creation>2000/01/10 15:16</creation>
<lastsave>2000/01/10 15:16</lastsave>
<lastaccess>2006/04/17 10:52</lastaccess>
<lastprint>2000/01/10 15:16</lastprint>
</datetime>
<summary><author>Stephane Le Marec</author><lastauthor>Stephane Le Marec</lastauthor><revisions>1</revisions></summary>
</file>
 
ANNEXE 2 :
 
menu.addParent("Node 1","page1.html" );
                menu.addChild("Lien 1","page1.html" );
    menu.addSousParent("Node 11","" );
                 menu.addChild("Lien 1","page1.html" );
                 menu.addChild("Lien 2","page2.html" );
              menu.addSousParent("Node 111","" );
                  menu.addChild("Lien 1","page1.html" );
 
ANNEXE3 :
 
<xsl:for-each select="//dir">
 menu.addParent("<xsl:value-of select="name"/>" );
 
 <xsl:for-each select="./file">
 <xsl:if test="extension[.='sxw'] or extension[.='odt'] or extension[.='pdf']" >
  <br/>
  menu.addChild("<xsl:value-of select="name"/>","file:///<xsl:value-of select="translate(fullname,'\','/')"/>" );
  <br/>
 </xsl:if>
     
 </xsl:for-each>
   
</xsl:for-each>

Reply

Marsh Posté le 18-04-2006 à 16:31:24   

Reply

Marsh Posté le 18-04-2006 à 19:39:31    

En découpant le string avec les fonctions substring-before et/ou substring-after?

Reply

Marsh Posté le 18-04-2006 à 22:56:09    

Merci, j'y ai penssé mais que faire ensuite du résultat du découpage ?

Reply

Marsh Posté le 19-04-2006 à 09:31:17    

Je cherche, je cherche
 
il faudrait que j'arrive à compter les '\' dans une chaine

Reply

Marsh Posté le 19-04-2006 à 18:41:00    

Et bien, tu comptes le nombre de fois que tu peux découper. Donc tu dois appeler récursivement le ton template en faisant +1 sur un paramètre. Quand tu ne peux plus découper tu renvois la valeur de ce paramètre.

Reply

Marsh Posté le 19-04-2006 à 22:52:49    

merci pour l'info
 
tu n'a pas un lien internet , ou un bout de code pour cela ?
 
je ne suis pas tout a fait a l'aise avec xsl

Reply

Marsh Posté le 20-04-2006 à 17:46:42    

Code :
  1. <?xml version="1.0" ?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" />
  4. <xsl:template match="/">
  5. <xsl:call-template name="countSlash">
  6.  <xsl:with-param name="str">/dir1/dir2/dir3/file</xsl:with-param>
  7. </xsl:call-template>
  8. </xsl:template>
  9. <xsl:template name="countSlash">
  10. <xsl:param name="str" />
  11. <xsl:param name="current" select="0" />
  12. <xsl:choose>
  13.  <xsl:when test="contains($str, '/')">
  14.   <xsl:call-template name="countSlash">
  15.    <xsl:with-param name="str" select="substring-after($str, '/')" />
  16.    <xsl:with-param name="current" select="$current + 1" />
  17.   </xsl:call-template>
  18.  </xsl:when>
  19.  <xsl:otherwise>
  20.   <xsl:value-of select="$current" />
  21.  </xsl:otherwise>
  22. </xsl:choose>
  23. </xsl:template>
  24. </xsl:stylesheet>

Reply

Marsh Posté le 20-04-2006 à 17:50:31    

je n'arrive toujours pas à couper une chaine de caractéres
 
ex XML : <fullname>l:\TRAVAIL\BTS_CPI\meca</fullname>
 
je veux extraire 'meca'
 
A l'aide

Reply

Marsh Posté le 20-04-2006 à 19:42:29    

super, merci, ça me donne bien le nombre de '/' , mais il faut que je compte la longueur de 2 chaines et que je compare les 2 resultats afin de voir si je monte ou de descend dans l'arborescence
 
Je peux faire comment ?

Reply

Marsh Posté le 20-04-2006 à 20:38:17    

En mettant le résultat de chaque appel dans une variable, et après il suffit de comparer:

Code :
  1. <xsl:variable name="foo">
  2.         <xsl:call-template name="countSlash">
  3.                 <xsl:with-param name="str">/dir1/dir2/dir3/file</xsl:with-param>
  4.         </xsl:call-template>
  5. </xsl:variable>


Cela dit s'il te faut juste la fin, pas besoin de compter. Il suffit de renvoyer le dernier morceau du string ($str) à la place de $current.

Reply

Marsh Posté le 20-04-2006 à 20:38:17   

Reply

Marsh Posté le 20-04-2006 à 23:16:37    

merci beaucoup, je remet ça en forme ce week-end et je recapitule en donnant le code complet

Reply

Marsh Posté le 21-04-2006 à 13:33:04    

j'ai encore un problème, le code suivant :
 

Code :
  1. <xsl:for-each select="//dir">  
  2. <xsl:value-of select="preceding::fullname" /><br/>
  3. <xsl:value-of select="fullname" /><br/>
  4. <xsl:value-of select="following::fullname" /><br/>
  5. ...


 
me renvoi :
 
l:\TRAVAIL\BTS_CPI\mecanique
l:\TRAVAIL\BTS_CPI\mecanique\Cinématique
l:\TRAVAIL\BTS_CPI\mecanique\Devoirs_TS1
 
a la boucle suivante :
 
l:\TRAVAIL\BTS_CPI\mecanique
l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cine_Pt
l:\TRAVAIL\BTS_CPI\mecanique\Devoirs_TS1
 
puis
 
l:\TRAVAIL\BTS_CPI\mecanique
l:\TRAVAIL\BTS_CPI\mecanique\Devoirs_TS1
l:\TRAVAIL\BTS_CPI\mecanique\Devoirs_TS2
 
 
en fait <xsl:value-of select="preceding::fullname" /> ne semble pas me fournir le résultat que je cherche (c a d 'l:\TRAVAIL\BTS_CPI\mecanique\Cinématique' pour la boucle 2
 
c'est bizare car '<xsl:value-of select="following::fullname" />' marche bien


Message édité par amiga56 le 21-04-2006 à 13:35:29
Reply

Marsh Posté le 21-04-2006 à 17:54:59    

En fait c'est la structure de mon fichier xml qui est particuliére, elle ressebble a cela :
 
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!-- Created with Catalogue version 4.2.3 [Soft Experience] -->
<involume name="DATA2" filesystem="NTFS" dategeneration = "21 Avril 2006 17:54">
<dir>
<id>1</id><name>dir</name><fullname>l:\Temp\Temp\test\dir</fullname>
<dir>
<id>2</id><name>dir1</name><fullname>l:\Temp\Temp\test\dir\dir1</fullname>
</dir>
<dir>
<id>3</id><name>dir2</name><fullname>l:\Temp\Temp\test\dir\dir2</fullname>
<dir>
<id>4</id><name>dir21</name><fullname>l:\Temp\Temp\test\dir\dir2\dir21</fullname>
</dir>
<dir>
<id>5</id><name>dir22</name><fullname>l:\Temp\Temp\test\dir\dir2\dir22</fullname>
</dir>
</dir>
<dir>
<id>6</id><name>dir3</name><fullname>l:\Temp\Temp\test\dir\dir3</fullname>
</dir>
</dir>
</involume>
 
il me faut jorsque je suis au niveau de dir21 par exemple pouvoir extraire le fullname de dir2 et de dir22


Message édité par amiga56 le 21-04-2006 à 17:57:41
Reply

Marsh Posté le 23-04-2006 à 14:36:40    

mon probleme a un peu evolué car j'ai du changer de type de menu
 
maintenant je dois a partir du fichier xml (voir post précedent) créer un fichier html qui ressemble a :
 
<ul>
  <li>....</li>
    <ul>
       <li>...</li>
       <li>...</li>
       ...
    </ul>
</ul>
 
ce fichier reprend la structure et les imbrications du fichier xml
 
n'y a t'il pas une façon simble de s'y prendre ?

Reply

Marsh Posté le 23-04-2006 à 16:44:05    

jai trouvé le bout de code suivant, ça fonctionne globalement sauf que de temps en temps il me crache en bloc tous un bout de mon fichier xml
 
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
<xsl:output method="xml" indent="yes" omit-xml-declaration ="yes" encoding="ISO-8859-1"/>  
 
<xsl:template match="dir">  
 <LI CLASS="clsHasKids">menu
 <UL>  
 <xsl:for-each select="file">  
 <LI>  
 <xsl:value-of select="fullname"/>
 </LI>  
 </xsl:for-each>  
 <xsl:if test="dir"><xsl:apply-templates /></xsl:if>  
 </UL>  
 </LI>  
</xsl:template>  
</xsl:stylesheet>
 
extrait de la sortie :
 
<LI CLASS="clsHasKids">menu
 <UL>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\A4_Meca.sdw</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\A4_Meca_Cours_RDM.sxw</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\A4_Meca_QuestionCours.sdw</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Bilan_poly_présent_TD_TP.sxc</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\descript.ion</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Dev_meca_Base.sdw</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\elements_de_la_gallerie_meca.sxd</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\essai%20temp.odb</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\MecaCommandeSoupages.txt</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\MecaComSoupapes.png</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Palan_Manuel.sdw</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\TS_CPI_Méca.sdd</LI>1mecaniquel:\TRAVAIL\BTS_CPI\mecanique2sdwA4_Meca.sdwl:\TRAVAIL\BTS_CPI\mecanique\A4_Meca.sdwA4_Meca.sdw16896a2000/01/10 15:162000/01/10 15:162006/04/21 17:522000/01/10 15:16Stephane Le MarecStephane Le Marec13sxwA4_Meca_Cours_RDM.sxwl:\TRAVAIL\BTS_CPI\mecanique\A4_Meca_Cours_RDM.sxwA4_MEC~1.SXW67754a2000-01-10T16:16:202005-09-08T10:18:382005-09-05T19:15:18PT10H33M7SOpenOffice.org 1.1.4 (Win32)Stephane Le Marecfr-FR531065160Info 0Info 1Info 2Info 34sdwA4_Meca_QuestionCours.sdwl:\TRAVAIL\BTS_CPI\mecanique\A4_Meca_QuestionCours.sdwA4_MEC~1.SDW16896a2000/01/10 14:162003/10/13 09:012006/04/21 17:522003/10/13 09:01Stephane Le Marec15sxcBilan_poly_présent_TD_TP.sxcl:\TRAVAIL\BTS_CPI\mecanique\Bilan_poly_présent_TD_TP.sxcBILAN_~1.SXC5653a2005-08-30T14:56:532005-08-30T15:09:30PT12M41SOpenOffice.org 1.1.4 (Win32)fr-FR4318Info 1Info 2Info 3Info 46iondescript.ionl:\TRAVAIL\BTS_CPI\mecanique\descript.iondescript.ion20ah2006/04/20 15:112006/04/20 15:112006/04/22 20:247sdwDev_meca_Base.sdwl:\TRAVAIL\BTS_CPI\mecanique\Dev_meca_Base.sdwDEV_ME~1.SDW17920a2000/02/10 14:192004/03/06 13:022006/04/21 17:522002/04/29 13:1701:46Stephane Le Marec118sxdelements_de_la_gallerie_meca.sxdl:\TRAVAIL\BTS_CPI\mecanique\elements_de_la_gallerie_meca.sxdELEMEN~1.SXD7937a2005-09-29T19:26:492005-09-29T20:10:04PT14M28SOpenOffice.org 1.1.4 (Win32)fr-FR538Info 1Info 2Info 3Info 49odbessai temp.odbl:\TRAVAIL\BTS_CPI\mecanique\essai%20temp.odbESSAIT~1.ODB4895a2006/04/06 16:012006/04/06 16:032006/04/21 17:2310txtMecaCommandeSoupages.txtl:\TRAVAIL\BTS_CPI\mecanique\MecaCommandeSoupages.txtMECACO~1.TXT1280a2006/02/06 20:132001/11/10 16:362006/04/21 17:2311pngMecaComSoupapes.pngl:\TRAVAIL\BTS_CPI\mecanique\MecaComSoupapes.pngMECACO~1.PNG472860a2006/02/06 20:132001/11/10 16:002006/04/21 17:4512sdwPalan_Manuel.sdwl:\TRAVAIL\BTS_CPI\mecanique\Palan_Manuel.sdwPALAN_~1.SDW80384a2000/01/06 07:392002/01/11 11:482006/04/21 17:522002/01/11 11:1301:27Stephane Le Marec613sddTS_CPI_Méca.sddl:\TRAVAIL\BTS_CPI\mecanique\TS_CPI_Méca.sddTS_CPI~1.SDD21504a1998/11/14 13:041998/11/14 13:042006/04/21 17:521998/11/14 13:0400:08le marec stephanele marec stephane2<LI CLASS="clsHasKids">menu
 <UL>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\(Cours_Cinematique_Composition de mouvements.sdw).pdf</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cinematique_prov.doc</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cours_Cinématique_Composition%20de%20mouvements.sdw</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cours_Cinématique_Transparent_Rappel_VitesseAccel_MvtDeRotation.sdw</LI>14Cinématiquel:\TRAVAIL\BTS_CPI\mecanique\Cinématique15pdf(Cours_Cinematique_Composition de mouvements.sdw).pdfl:\TRAVAIL\BTS_CPI\mecanique\Cinématique\(Cours_Cinematique_Composition de mouvements.sdw).pdf(COURS~1.PDF869505a2006/02/06 20:132004/09/09 15:482006/04/22 20:141.3falseamiga562004/09/09 15:47:172004/09/09 15:47:17PDFCreator Version 0.8.0GNU Ghostscript 7.05(Cours_Cinematique_Composition de mouvements.sdw)116docCinematique_prov.docl:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cinematique_prov.docCINEMA~1.DOC8192a2006/02/06 20:132002/11/11 11:422006/04/22 15:3717sdwCours_Cinématique_Composition de mouvements.sdwl:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cours_Cinématique_Composition%20de%20mouvements.sdwCOURS_~1.SDW46080a2000/01/10 14:162004/09/09 14:122006/04/22 15:372004/09/09 13:4701:33Stephane Le Marec518sdwCours_Cinématique_Transparent_Rappel_VitesseAccel_MvtDeRotation.sdwl:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cours_Cinématique_Transparent_Rappel_VitesseAccel_MvtDeRotation.sdwCOURS_~2.SDW43008a2000/01/10 14:162004/09/13 11:272006/04/22 20:162004/09/13 11:2704:33Stephane Le Marec10<LI CLASS="clsHasKids">menu
 <UL>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cine_Pt\Cinematique_Point.sdw</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cine_Pt\Devcinematique.txt</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cine_Pt\DevCinematiquePt.png</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cine_Pt\DevCinematiquePt_2.png</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cine_Pt\Dev_CinematiquePt.sdw</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cine_Pt\Dev_CinematiquePt2.sdw</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cine_Pt\TD_Cinematique_Point.sdw</LI>
<LI>l:\TRAVAIL\BTS_CPI\mecanique\Cinématique\Cine_Pt\TD_Cinematique_Point.sdw.pdf</LI>
</UL>
</LI>
</UL>
</LI>

Reply

Sujets relatifs:

Leave a Replay

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