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 :

[XSL]Tree depuis matriciel


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 37
    Par défaut [XSL]Tree depuis matriciel
    Bonjour,

    Je cherche a réaliser une feuille XSL qui me permettrai de générer un fichier texte, organisé sous forme d'arbre dont le nombre d'imbrication est variable.

    Ma source est une base de donnée FileMaker, qui permet évidemment l'export en XML via XSL. Pour faciliter la saisie dans la base, les enregistrements sont stockés sous forme de nœud avec la possibilité de leur attribuer un nœud parent. Les relations sont systématiquement de type [1]parent à [N]enfant.

    Lors de l'export brut XML, j'ai un arbre XML de cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <ROW MODID="9" RECORDID="9">
    	<COL>
    		<DATA></DATA>
    	</COL>
    	<COL>
    		<DATA>car</DATA>
    	</COL>
    	<COL>
    		<DATA>year=1999</DATA>
    	</COL>
    </ROW>
    Avec :
    - COL[1] correspond au titre du nœud parent (vide si niveau d'origine, mais je pourrais placer une valeur par défaut)
    - COL[2] correspond au titre du nœud
    - COL[3] correspond à une valeur directement associée au nœud

    Je cherche à obtenir un résultat de cette forme :
    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
     
    car
    {
    	name=
    	year=
    	id=
    	credits=
    	comments=
    	version=
    	wheels=
    	ff_factor=
    	skid
    	{
    		sample=
    	}
    	shadow
    	{
    		texture=
    		width=
    		lenght=
    		offset_z=
    	}
    }
    J'ai réussi à me débrouiller avec l'entête, mais je bute sur le reste (le principal ! ) n'arrivant pas à créer l'indentation.
    Comment puis-je procéder ? Est-ce qu'il me manque des informations dans mon XML ?

    Merci d'avance !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 37
    Par défaut
    En me relisant, je pense que l'exemple de source XML est trop succin. Pour obtenir le résultat énoncé, j'aurais comme source XML, l'arbre suivant :

    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
     
    	<ROW MODID="25" RECORDID="4">
    		<COL>
    		</COL>
    		<COL>
    			<DATA>car</DATA>
    		</COL>
    		<COL>
    			<DATA>name=</DATA>
    			<DATA>year=</DATA>
    			<DATA>id=</DATA>
    			<DATA>credits=</DATA>
    			<DATA>comments=</DATA>
    			<DATA>version=</DATA>
    			<DATA>wheels=</DATA>
    			<DATA>ff_factor=</DATA>
    		</COL>
    	</ROW>
    	<ROW MODID="16" RECORDID="5">
    	<COL>
    		<DATA>car</DATA>
    	</COL>
    	<COL>
    		<DATA>skid</DATA>
    	</COL>
    	<COL>
    		<DATA>sample=</DATA>
    	</COL>
    	</ROW>
    <ROW MODID="14" RECORDID="6">
    	<COL>
    		<DATA>car</DATA>
    	</COL>
    	<COL>
    		<DATA>shadow</DATA>
    	</COL>
    	<COL>
    		<DATA>texture=</DATA>
    		<DATA>width=</DATA>
    		<DATA>lenght=</DATA>
    		<DATA>offset_z=</DATA>
    	</COL>
    </ROW>
    Donc mon problème est de dire : quand COL[1] = COL[2] d'un autre ROW, il faut l'imbriquer dans ce parent.

  3. #3
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    Il faut penser dans le sens inverse.
    Quand tu parses ta col[1] tu parses les col[2] qui correspondent.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 37
    Par défaut
    Bonjour Erwy,

    Si je comprends bien ce que veux dire "penser dans le sens inverse"…
    Je me suis fait un brouillon en français de ce que doit faire XSL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Pour une valeur de COL[1]
    	si //ROW/COL[2] = COL[1]
    		il va au ROW correspondant, puis
    			{
    			COL[3]
    				test deuxième si ?
    			}
    	si aucun ROW/COL[2]=COL[1]
    		valeur de COL[2]
    			{
    			valeurs de COL[3]
    		}
    C'est le raisonnement à tenir ? Comment être sûr que le "parent"(COL[1]) ne sera traité qu'une fois ?

    Merci d'avance

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 37
    Par défaut
    J'essaye avec la méthode de Muench, mais le résultat n'est pas encore correct, puisque ça regroupe mes "parents" sans développer les "enfants"…

    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
     
    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet exclude-result-prefixes="fmp" xmlns:fmp="http://www.filemaker.com/fmpxmlresult"	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
    <xsl:key name="regrouper" match="fmp:ROW/fmp:COL[1]/fmp:DATA" use="."/>
        <xsl:template match="fmp:FMPXMLRESULT/fmp:RESULTSET">
        	<xsl:apply-templates select="fmp:ROW/fmp:COL[1]/fmp:DATA[generate-id(.)=generate-id(key('regrouper',.)[1])]"/>
        </xsl:template>
        <xsl:template match="fmp:ROW/fmp:COL[1]/fmp:DATA">
        	<xsl:value-of select="//fmp:COL[2]/fmp:DATA"/>
    		<xsl:text>{</xsl:text>
    			<xsl:copy-of select="."/>
    			<xsl:apply-templates select="//fmp:ROW/fmp:COL[3]/fmp:DATA[../fmp:ROW/fmp:COL[1]/fmp:DATA=current()]"/>
    		<xsl:text>}</xsl:text>
    	</xsl:template>
    	<xsl:template match="fmp:ROW/fmp:COL[3]/fmp:DATA">
    		<xsl:copy-of select="."/>
    		<xsl:value-of select="fmp:ROW/fmp:COL[4]/fmp:DATA"/>
    	</xsl:template>
    </xsl:stylesheet>
    Autre chose bizarre, bien que je spécifie dans l'entête indent="yes" les données restent sur une ligne !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 37
    Par défaut Des modifs…
    Bon, autre test, pas plus concluant, avec un xsl:if en boucle…

    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" ?>
    <xsl:stylesheet exclude-result-prefixes="fmp" xmlns:fmp="http://www.filemaker.com/fmpxmlresult"	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
        <xsl:template match="fmp:FMPXMLRESULT/fmp:RESULTSET">
        	<xsl:for-each select="//fmp:ROW/fmp:COL[1]/fmp:DATA">
        		<xsl:if test="fmp:ROW/fmp:COL[1]/fmp:DATA = //fmp:ROW/fmp:COL[3]/fmp:DATA">
        			<xsl:value-of select="fmp:ROW/fmp:COL[2]/fmp:DATA"/>
        			<xsl:text>{</xsl:text>
        				<xsl:value-of select="fmp:ROW/fmp:COL[5]/fmp:DATA"/>
        				<xsl:apply-templates />
        			<xsl:text>{</xsl:text>
        		</xsl:if>
        	</xsl:for-each>
    	</xsl:template>
    </xsl:stylesheet>
    Sachant que dans mon export XML, j'ai rajouté les "id" pour qu'il n'y ai pas de confusion : le nom peut être appelé plusieurs fois avec des parents différents et doit apparaître autant de fois qu'il a de parent différent.

    Un extrait :
    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
     
    <RESULTSET FOUND="54">
    <ROW MODID="25" RECORDID="4">
    	<COL></COL>
    	<COL></COL>
    	<COL>
    		<DATA>N0004</DATA>
    	</COL>
    	<COL>
    		<DATA>car</DATA>
    	</COL>
    	<COL>
    		<DATA>name=</DATA>
    		<DATA>year=</DATA>
    		<DATA>id=</DATA>
    		<DATA>credits=</DATA>
    		<DATA>comments=</DATA>
    		<DATA>version=</DATA>
    		<DATA>wheels=</DATA>
    		<DATA>ff_factor=</DATA>
    	</COL>
    </ROW>
    <ROW MODID="16" RECORDID="5">
    	<COL>
    		<DATA>N0004</DATA>
    	</COL>
    	<COL>
    		<DATA>car</DATA>
    	</COL>
    	<COL>
    		<DATA>N0005</DATA>
    	</COL>
    	<COL>
    		<DATA>skid</DATA>
    	</COL>
    	<COL>
    		<DATA>sample=</DATA>
    	</COL>
    </ROW>
    <ROW MODID="14" RECORDID="6">
    	<COL>
    		<DATA>N0004</DATA>
    	</COL>
    	<COL>
    		<DATA>car</DATA>
    	</COL>
    	<COL>
    		<DATA>N0006</DATA>
    	</COL>
    	<COL>
    		<DATA>shadow</DATA>
    	</COL>
    	<COL>
    		<DATA>texture=</DATA>
    		<DATA>width=</DATA>
    		<DATA>lenght=</DATA>
    		<DATA>offset_z=</DATA>
    	</COL>
    </ROW>
    </RESULTSET>

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

Discussions similaires

  1. Imprimer un fo (xsl-fo) depuis Form c#
    Par yayabon dans le forum C#
    Réponses: 0
    Dernier message: 11/04/2011, 15h26
  2. [XSLT][Javascript] recup/modif xsl:variable depuis javascript
    Par hjn31 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 24/09/2009, 10h25
  3. [XPATH] [XSL] Result tree fragment
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/11/2005, 11h30
  4. generer xsl depuis xml avec balises inconues ?
    Par cedre dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 24/06/2003, 09h00
  5. Tree View avec XML et XSL
    Par Drooxy dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 22/04/2003, 10h21

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