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] GraphML vers SVG


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut [XSLT] GraphML vers SVG
    Bien le bonsoir !

    Je me trouve confronté à un problème que j'ai du mal à résourdre.
    Il me faut transformer un fichier GraphML en un fichier SVG.
    Tous deux ont une syntaxe de type XML.

    Le fichier GraphML représente un arbre, avec des noeuds (node) et des arrêtes (edge).
    Un noeud s'identifie par son attribut id.
    Une arrête relie 2 noeuds (source et target).

    Exemple de fichier graphML :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    <?xml version="1.0" encoding="UTF-8"?>
    <graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
     
      <graph id="G" edgedefault="directed">
        <node id="0" final="0"/>
        <node id="1" final="0"/>
        <node id="2" final="0"/>
        <node id="3" final="1"/>
        <node id="4" final="0"/>
        <node id="5" final="0"/>
        <node id="6" final="0"/>
        <node id="7" final="1"/>
        <node id="8" final="0"/>
        <node id="9" final="0"/>
        <node id="10" final="1"/>
        <edge source="0" target="0" />
        <edge source="0" target="1" />
        <edge source="1" target="1" />
        <edge source="1" target="2" />
        <edge source="2" target="3" />
        <edge source="2" target="4" /> 
        <edge source="4" target="4" />
        <edge source="4" target="5" />
        <edge source="4" target="6" />
        <edge source="5" target="7" />
        <edge source="6" target="8" />
        <edge source="8" target="9" />
        <edge source="9" target="10" />
      </graph>
    </graphml>
    Exemple de fichier XSL :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet 
    					version="2.0" 					 
    					xpath-default-namespace="http://graphml.graphdrawing.org/xmlns"
    					xmlns:svg="http://www.w3.org/2000/svg"
    					xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      
      <xsl:output
    					method="xml"
    					version="1.0"
    					encoding="UTF-8"
    					omit-xml-declaration="no"
    					indent="yes"/>
    
    <xsl:variable name="noeud_racine">0</xsl:variable >
    
    <xsl:template match="/graphml/graph">
    <svg:svg xmlns="http://www.w3.org/2000/svg"
    		version="1.1" 
    		width="100%" height="100%" 
    		viewBox="0 0 1000 1000">
    	<svg:rect width="100%" height="100%" fill="none" stroke="black" stroke-width="3"/>	
    	<xsl:apply-templates select="node[@id = $noeud_racine]" />
    </svg:svg>			
    </xsl:template>
    
    <xsl:template match="node">
    		<xsl:variable name="id_noeud_actuel" select="@id" />
                    <!-- ICI : dessiner le noeud : x="???" y="???" -->
    	        <xsl:apply-templates select="../edge[@source = $id_noeud_actuel][@target != $id_noeud_actuel]" />    
    </xsl:template>
    
    <xsl:template match="edge">
    		<xsl:variable name="id_noeud_cible" select="@target" />
    		<xsl:if test="@source != @target"> 
    			<xsl:apply-templates select="../node[@id = $id_noeud_cible]" />
    		</xsl:if>
    </xsl:template>
    
    
    </xsl:stylesheet>
    En pratique, cette feuille XSL-T sélectionne toutes les arrêtes dont l'attribut "source" est le noeud courant. Pour chaque arrête, elle va chercher les noeuds fils : ceux dont l'attribut "id" est égal à l'attribut "target" de l'arrête.
    On ne tient pas compte des arrêtes qui pointent sur le noeud source (source = target).

    Mon soucis n'est donc pas de créer le fichier SVG...
    Mon vrai soucis c'est d'obtenir les coordonnées des objets SVG que je vais dessiner.

    Je m'explique : le noeud racine possède un certain nombre de fils.
    Si je place le noeud racine en X=10 et Y=0, alors je dois placer ses fils en Y=50 (par exemple). Qui plus est, je dois les repartirs sur l'axe horizontal, de façon homogène (Exemple pour 3 fils : X=33, X=66 et X 99).

    Je ne parviens pas à faire ce placement... Pourriez-vous me venir en aide s'il vous plait ?

  2. #2
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    Je pense qu'une solution serait de calculer la position Y de chaque noeud en fonction du nombre de parents qu'il possède, et sa position X en fonction du nombre de frères du même rang que lui.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Par défaut
    Dans le cas où ça pourrait aider, il existe un excellent logiciel libre : www.graphviz.org

    Il génère des schémas à partir de GraphML vers SVG, tout en cadrant automatiquement les composants du graphe.

Discussions similaires

  1. [XSLT] Xml vers SVG
    Par renaissancecarto dans le forum XSL/XSLT/XPATH
    Réponses: 15
    Dernier message: 07/01/2010, 16h03
  2. [XSLT] XML vers HTML
    Par SONY30 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 05/04/2007, 08h54
  3. [XSLT] Générer du SVG avec XSLT
    Par soli.f dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 19/03/2007, 09h16
  4. [XSLT]XML vers tableau html
    Par lcdDEV dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/10/2006, 16h55
  5. [XSLT] XML vers XML
    Par ren0 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/10/2004, 12h54

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