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]Transformation XSL / tableaux [Débutant(e)]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut [XSLT]Transformation XSL / tableaux
    Bonjour à tous,

    Je souhaiterai faire cette transformation ci-dessus, mais je ne sais pas trop comment, étant débutante.
    Je pensais le faire avec des tableaux de données qui contiendraient la liste des noeuds que j'ai, mais apparemment on ne peut pas avoir des tableaux (structures de données) avec XSL (d'où le premier post que j'ai délesté).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <topology>
        <node id="test">
            <node id="1"/>
        </node>
        <node id="P">
            <node id="1"/>
            <node id="2"/>
        </node>  
        <link source="test" target="P"/>
    </topology>

    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <node id="test">
            <node id="1"/>
    </node>
    devient après la transformation J'ai en sortie un fichier de type xml (graphml):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <graphml>
        <graph id="G">
            <node id="test1"/>
            <node id="P1"/>
            <node id="P2"/>
            <edge source="test1" target="P1"/>
            <edge source="test1" target="P2"/>
         </graph>
    </graphml>
    Et mon problème est d'étendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <link source="test" target="P"/>
    en:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <edge source="test1" target="P1"/>
    <edge source="test1" target="P2"/>
    Quelqu'un pourrait-il m'aider?

    Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    peux tu nous donner un fichier xml de départ ainsi que ta feuille de style (et un fichier xml de sortie que tu souhaites avoir)
    merci

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Bien sûr, voici les exemples:

    Fichier xml exemple en entrée:

    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
     
    <?xml version="1.0" encoding="UTF-8" ?>
    <topology>
         <node id="CS" description="Content Servers">
              <node id="1" />
         </node>
         <node id="P" description="Proxies" >
              <node id="1" />
              <node id="2" />
         </node>
              <node id="Target" >
              <node id="subnet1" />
         </node>
         <link from="CS" to="P" />
         <link from="P.1" to="Target.subnet1" />
    </topology>
    Et en sortie, je voudrais avoir:

    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="UTF-8"?>
    <graphml xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns graphml+xlink.xsd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://graphml.graphdrawing.org/xmlns">
         <desc></desc>
              <graph edgedefault="directed">
                   <desc>Topology of Network</desc>
                   <node id="CS.1" name="CS.1" description="Content Servers"/>
                   <node id="P.1" name="P.1" description="Proxies"/>
                   <node id="P.2" name="P.2" description="Proxies"/>
                   <node id="Target.subnet1" name="Target.subnet1"/>
                   <edge source="CS.1" target="P.1" />
                   <edge source="CS.1" target="P.2" />
                   <edge source="P.1" target="Target.subnet1"/>
              </graph>
    </graphml>
    sachant que j'arrive déjà à récuperer les bons noms de noeuds. Je n'arrive juste pas à étendre les liens comme il faut de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <link from="CS" to="P" />
    à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <edge source="CS.1" target="P.1" />
    <edge source="CS.1" target="P.2" />
    Merci de ton aide par avance. Je reconnais que j'ai bcp de mal à faire cela.

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut La feuille de style
    Voici la feuille de style qui m'a permis d'obtenir le fichier de sortie (graphml) décrit dans le post précédent:

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml"
    		indent="yes"
    		omit-xml-declaration="no"
    		encoding="UTF-8"/>
    	<xsl:param name="inputFileName"/>
     
     
        <xsl:template match="topology">
    		<graphml 	xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns graphml+xlink.xsd">
    			<desc><xsl:value-of select="$inputFileName"/></desc>
    			<graph edgedefault="directed">
    				<desc>Topology of Network</desc>
    				<xsl:apply-templates select="./node">
    					<xsl:with-param name="parentNodeId"/>
    				</xsl:apply-templates>
    				<xsl:apply-templates select="./link">
    					<xsl:with-param name="parentNodeId"/>
    				</xsl:apply-templates>
    			</graph>
    		</graphml>
    	</xsl:template>
     
    	<xsl:template match="node">
    		<xsl:param name="parentNodeId"/>
     
    		<xsl:variable name="currentNodeId">
    			<xsl:if test="$parentNodeId!=''">
    				<xsl:value-of select="$parentNodeId"/>
    				<xsl:text>.</xsl:text>
    			</xsl:if>
    			<xsl:value-of select="@id"/>
    		</xsl:variable>
     
    		<!-- If there is a node parent, retrieve the node childs -->
    		<xsl:if test="$parentNodeId!=''">
    			<xsl:element name="node">
    				<xsl:attribute name="id">
    					<xsl:value-of select="$currentNodeId"/>
    				</xsl:attribute>
    				<xsl:attribute name="name">
    					<xsl:value-of select="$currentNodeId"/>
    				</xsl:attribute>
    			</xsl:element>	
    		</xsl:if>
    		<xsl:apply-templates select="./node">
    			<xsl:with-param name="parentNodeId"><xsl:value-of select="$currentNodeId"/></xsl:with-param>
    		</xsl:apply-templates>
     
    	</xsl:template>	
     
     
    	<xsl:template match="link">		
    		<!-- Add the edge in all cases (directed  = true or directed = false) -->
    		<xsl:element name="edge">
    			<xsl:attribute name="source">
    				<xsl:value-of select="@from"/>
    			</xsl:attribute>
    			<xsl:attribute name="target">
    				<xsl:value-of select="@to"/>
    			</xsl:attribute>
    		</xsl:element>
     
    	</xsl:template>
     
    </xsl:stylesheet>

  5. #5
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    voila une réponse
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    <xsl:output 
      encoding="ISO-8859-15"
      method="html"
      doctype-public="-//W3C//DTD HTML 4.01//EN"
      doctype-system="http://www.w3.org/TR/html4/strict.dtd"
      indent="yes" />
     
    <xsl:template match="topology">
    	<graphml xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns graphml+xlink.xsd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://graphml.graphdrawing.org/xmlns">
         		<desc></desc>
              	<graph edgedefault="directed">
                   		<desc>Topology of Network</desc>
    			<xsl:apply-templates select="./node/node" />
    			<xsl:apply-templates select="./link" />
             	 </graph>
    	</graphml>
    </xsl:template>
     
    <xsl:template match="node">
    	<node>
    		<xsl:attribute name="id"><xsl:value-of select = "./parent::*/@id" />.<xsl:value-of select = "@id" /></xsl:attribute>
    		<xsl:attribute name="name"><xsl:value-of select = "./parent::*/@id" />.<xsl:value-of select = "@id" /></xsl:attribute>
    		<xsl:attribute name="description">ModelName</xsl:attribute>
    	</node>
    </xsl:template>
     
    <xsl:template match="link">
    	<xsl:variable name="from"><xsl:value-of select="@from"/></xsl:variable>
    	<xsl:variable name="to"><xsl:value-of select="@to"/></xsl:variable>
    	<xsl:for-each select = "//node[@id=$from]/node" >
    		<xsl:variable name="fromnode"><xsl:value-of select="@id"/></xsl:variable>
    			<xsl:for-each select = "//node[@id=$to]/node" >
    				<edge>
    					<xsl:attribute name="source"><xsl:value-of select = "$from" />.<xsl:value-of select = "$fromnode" /></xsl:attribute>
    					<xsl:attribute name="target"><xsl:value-of select = "$to" />.<xsl:value-of select = "@id" /></xsl:attribute>
    				</edge>
    		</xsl:for-each>
    	</xsl:for-each>
     
    	<xsl:if test="contains($from, '.')">
    		<edge>
    			<xsl:attribute name="source"><xsl:value-of select = "$from" /></xsl:attribute>
    			<xsl:attribute name="target"><xsl:value-of select = "$to" /></xsl:attribute>
    		</edge>
    	</xsl:if>
    </xsl:template>
     
    </xsl:stylesheet>

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci, fraoustin.
    Je regarde ce que cela donne de mon côté et je te tiens au courant.
    C'est génial de ta part!!!

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Fraoustin,
    Merci beaucoup, j'ai utilisé ta feuille de style, et elle répond bien à ce que je voulais faire. C'est super

    Seulement, comment puis-je modifier ta feuille de style, pour ne pas limiter le nombre de hierarchie de noeuds "node" à deux uniquement? Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <node id="CS" description="Content Servers">
        <node id="1" />
        <node id="CSBIS" description="Content Servers">
            <node id="1" />
        </node>
    </node>
    <node id="P" description="Proxies">
        <node id="1" />
        <node id="2" />
    </node>
    <link from="CS" to="P" />
    ce qui me permettra d'avoir dans mon fichier de sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <node id="CS.1" name="CS.1" description="Content Servers"/>
    <node id="CS.CSBIS" name="CS.CSBIS" description="Content Servers"/>
    <node id="CS.CSBIS.1" name="CS.CSBIS.1" description="Content Servers"/>
    <node id="P.1" name="P.1" description="Proxies"/>
    <node id="P.2" name="P.2" description="Proxies"/>
    <edge source="CS.1" target="P.1"/>
    <edge source="CS.1" target="P.2" />
    <edge source="CS.CSBIS" target="P.1" />
    <edge source="CS.CSBIS" target="P.2" />
    <edge source="CS.CSBIS.1" target="P.1" />
    <edge source="CS.CSBIS.1" target="P.2" />

    Merci encore...

  8. #8
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    il faudrait pouvoir sélectionner le dernier noeud node d'une branche
    puis faire une boucle pour remonté sur cette branche et obtenir tout les ids

    il faut que je regarde cela de plus près

  9. #9
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    concernant la fin de chaine il suffit de faire un count(.//node) <> 0
    si fin de chaine on applique un template.

Discussions similaires

  1. [SAX] [XSLT] Problème transformation XSL avec SAX et namespace
    Par thierry_b dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 17/12/2008, 14h24
  2. [XSLT] CDATA par défaut lors d'une transformation xsl
    Par thierry_b dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 16/12/2008, 13h57
  3. [XSLT] transformation xsl avec un fichier xml en utf8
    Par thierry_b dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/12/2008, 10h46
  4. [XSLT]Transformer XSL avec du XSL
    Par belibech dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/07/2007, 15h18
  5. [XSLT] Insertion du nom du fichier XML par transformation XSL
    Par stepd dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/07/2006, 11h40

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