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 :
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 <?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>
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.
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>
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 ?
Partager