IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

[XSLT]Projet: réaliser une carte


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 154
    Points : 62
    Points
    62
    Par défaut [XSLT]Projet: réaliser une carte
    Bonjour à tous. J'ai un sacré défit pour mon premier projet xslt. Je débute et je ne connais pas encore toutes les roublardises du langage. Je vous soumet donc ce que j'ai fait.

    Mon xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <?xml-stylesheet href="carte.xsl" type="text/xsl"?>
    <xml>
    <cases><X>0</X><Y>5</Y></cases>
    <cases><X>1</X><Y>5</Y></cases>
    <cases><X>2</X><Y>5</Y></cases>
    <cases><X>3</X><Y>5</Y></cases>
    ....
    <cases><X>0</X><Y>6</Y></cases>
    <cases><X>1</X><Y>6</Y></cases>
    <cases><X>2</X><Y>6</Y></cases>
    <cases><X>3</X><Y>6</Y></cases>
    ....
    </xml>
    Bien sur le xml est extensible. Si l'on prend une carte de 200*200 de dimension, ça fait 40.000 cases....!!!!

    Le but est de générer une carte de 10*10 cases quoi qu'il arrive. Cette carte est centrer de façon dynamique sur des coordonnées.

    Voila donc comment je gere ca via mon xls:

    Le template qui parse le xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <xsl:template match="xml">
    <html><body>
    	<p>Liste de nombres :</p>
    	<table cellpadding="0" cellspacing="0" border="1">
    		<xsl:call-template name="boucley" />
    	</table>
    </body></html>
    </xsl:template>
    Il lance la boucle des lignes Y. voici son code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <xsl:template name="boucley">
    	<xsl:param name="debuty" select="0" />
    	<xsl:param name="finy" select="10" />
     
    	<xsl:if test="$debuty &lt; $finy">
    		<tr>
    		<xsl:call-template name="bouclex">
    			<xsl:with-param name="debuty" select="($debuty)" />
    		</xsl:call-template>
    		</tr>
    		<xsl:call-template name="boucley">
    			<xsl:with-param name="debuty" select="($debuty)+1" />
    		</xsl:call-template>
    	</xsl:if>
    </xsl:template>
    Chaque passage de boucle lance la création des colonnes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <xsl:template name="bouclex">
    	<xsl:param name="debutx" select="0" />
    	<xsl:param name="debuty" select="0" />
    	<xsl:param name="finx" select="10" />
     
    	<xsl:if test="$debutx &lt; $finx">
    		<td>
    			<xsl:for-each select="/xml/cases[X=$debutx and Y=$debuty]">
    				OK
    			</xsl:for-each>
    		</td>
    		<xsl:call-template name="bouclex">
    			<xsl:with-param name="debutx" select="($debutx)+1" />
    		</xsl:call-template>
    	</xsl:if>
    </xsl:template>
    Ce coup ci on créer les td pour chaque ligne et colonne. Le truc c que je fait un for each pour vérifier sir la case que l'on teste existe dans le xml. Par la suite si cette case est trouvée, on affichera des informations venant du xml.

    Le truc c'est que si je génère un xml de 200*200 cases, cela devient extrêmement long.

    Donc voila j'attends vos avis, si j'ai fait des erreurs ou qu'il y a moyen de faire mieux je suis preneur.

    merci bien, Wells

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 154
    Points : 62
    Points
    62
    Par défaut
    un ptit up, personne ne s'y connait???

  3. #3
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Ce qui est très couteux, c'est de faire un <xsl:for-each> pour chaque cellule HTML (un <xsl:if> aurait été tout de même moins grave). C'est une méthode exponentielle !

    Vous devriez plutôt commencer par trier les cases par ligne puis par colonne, gérer le cas d'une ligne vide et générer autant de cellules HTML vides que nécessaire avant chaque case en n'oubliant pas pour la dernière les cellules HTML vides après. Comme cela, vous ne parcourerez qu'une seule fois toutes les cases.
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 154
    Points : 62
    Points
    62
    Par défaut
    Je veux bien mais concrètement on fait ça comment ^^

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 154
    Points : 62
    Points
    62
    Par défaut
    Je remonte un peu le sujet car le projet à évoluer concrètement.

    Voila le xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <xml>
    	<Case X="-6" Y="-6" Type="">
    	</Case>
    	<Case X="-6" Y="-5" Type="">
    	</Case>
    	<Case X="-6" Y="-4" Type="">
    	</Case>
    	<Case X="-6" Y="-3" Type="">
    	</Case>
    	<Case X="-6" Y="-2" Type="">
    	</Case>
    	<Case X="-6" Y="-1" Type="">
    	</Case>
    	<Case X="-6" Y="0" Type="">
    	</Case>
    	<Case X="-6" Y="1" Type="">
    	</Case>
    ..........
    Je créer tjs mon tableau via des boucles et pour chaque case je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    		<xsl:choose>
    			<xsl:when test="xml/Case[@X=$debutx and @Y=$debuty]">
    				<xsl:variable name="type_s" select="xml/Case[@X=$debutx and @Y=$debuty]/TypeSys" />
    				<xsl:variable name="type_f" select="xml/Case[@X=$debutx and @Y=$debuty]/TypeFlo" />
                                   <td>plein</td>
    			</xsl:when>	
    			<xsl:otherwise>
    				<td>vide</td>
    			</xsl:otherwise>
       		</xsl:choose>
    Bien sur c'est extrêmement couteux. sans ca, l'affichage est instantané.

    Si je rajoute le <xsl:when test="xml/Case[@X=$debutx and @Y=$debuty]"> je suis à 2s.

    Si je rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    				<xsl:variable name="type_s" select="xml/Case[@X=$debutx and @Y=$debuty]/TypeSys" />
    				<xsl:variable name="type_f" select="xml/Case[@X=$debutx and @Y=$debuty]/TypeFlo" />
    je passe à 7s.

    Je vous soumet le problème car je ne pense pas que mon script soit viable.En effet je ne vais que le complexifier. Les temps de création vont alors exploser.

    J'aimerais savoir si l'un de vous pourrais m'aiguiller sur des solutions concrètes ou auditer rapidement ce code.

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    il est normal que tu passes de 2s à 7s, tu exécutes 3 fois la même requête XPath. Il suffit de factoriser en utilisant une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:variable name="case" select="xml/Case[@X=$debutx and @Y=$debuty]" />
    <xsl:choose>
      <xsl:when test="$case">
        <xsl:variable name="type_s" select="$case/TypeSys" />
        <xsl:variable name="type_f" select="$case/TypeFlo" />
        <td>plein</td>
      </xsl:when>	
      <xsl:otherwise>
        <td>vide</td>
      </xsl:otherwise>
    </xsl:choose>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 154
    Points : 62
    Points
    62
    Par défaut
    Il me semble avoir tenté cette méthode sans résultat. Je réessaye ce soir et je vous tient au courant.

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 154
    Points : 62
    Points
    62
    Par défaut
    Effectivement ça marche, les temps d'accès sont bien meilleurs. Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réaliser une carte interactive, quel langage simple ?
    Par apal dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 03/03/2022, 16h53
  2. Réponses: 3
    Dernier message: 17/06/2011, 12h53
  3. Comment réaliser une telle carte en HTML ?
    Par pdtor dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 21/10/2010, 10h16
  4. Comment réaliser une "carte" en 3D?
    Par zuzuu dans le forum Développement 2D, 3D et Jeux
    Réponses: 9
    Dernier message: 15/02/2008, 21h50
  5. [WPF & C#] Réalisation d'une carte
    Par Doug_ dans le forum Windows Presentation Foundation
    Réponses: 12
    Dernier message: 23/08/2007, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo