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

Bibliothèques et frameworks PHP Discussion :

[DOM] [XSL] Convertir un fichier XML vers un fichier CSS


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Invité
    Invité(e)
    Par défaut [DOM] [XSL] Convertir un fichier XML vers un fichier CSS
    Salut a vous tous
    J’ai un petit soucis au niveau d’un projet je doit convertir un fichier xml en un fichier css en utilisant php
    La structure du fichier xml et bien organise pour que ca se convertie mais comment je vais faire sachant que c’est un fichier xml qui illustre toute l’interface et chaque éléments de l’interface a ces propre style
    Voici un petit extrait du code

    Code XML : 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
    <titre id="titre"><style>	
    				<backgroundcolor/>
    				<background-image xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:base64Binary" filename="" content-type=""/>
    				<Selectedcolor/>
    				<textStyle>
    					<font-family/>
    					<font-size/>
    					<font-color/>
    				</textStyle></style></titre>
     
    <texte id="texte"><style>	
    				<backgroundcolor/>
    				<background-image xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:base64Binary" filename="" content-type=""/>
    				<Selectedcolor/>
    				<textStyle>
    					<font-family/>
    					<font-size/>
    					<font-color/>
    				</textStyle></style></texte>

    Merci d’avance
    Dernière modification par julp ; 20/03/2007 à 13h44.

  2. #2
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Tu pourrais utiliser une transformation xslt. Voici un code de départ:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $xml = new DOMDocument();
    $xml->load('css.xml'); // ton fichier xml
    $xsl = new DOMDocument();
    $xsl->load('css.xsl'); // le fichier xsl
    $xslt = new XSLTProcessor();
    $xslt->importStylesheet($xsl);
    echo $xslt->transformToXml($xml);
    Et voici un début de fichier xsl:

    Code xml : 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
     
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
      <xsl:output method="text"  omit-xml-declaration="yes"/>
      <xsl:strip-space elements="*"/>
     
      <xsl:template match="/*/*">
        #<xsl:value-of select="@id"/> {
        <xsl:apply-templates/>
        }
      </xsl:template>
     
      <xsl:template match="backgroundcolor">
        background-color: <xsl:value-of select="."/>;
      </xsl:template>
     
      <xsl:template match="textStyle/*">
        <xsl:value-of select="name()"/>: <xsl:value-of select="."/>;
      </xsl:template>
     
    </xsl:stylesheet>

    Avec des valeurs au pif, ça output:
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #titre {
    background-color: #dddddd;
    font-family: verdana, thahoma;
    font-size: 1.1em;
    font-color: #aaaaaa;
    }
    #texte {
    background-color: #bbbbbb;
    font-family: thahoma;
    font-size: 0.9em;
    font-color: #cccccc;
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut
    J’ai changer un peut la structure de mon document xml pour que ça soit un peut facile car avec l’ancienne structure ça serai un peut compliquer et long
    Voila un extrait de la nouvelle structure :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    …..
    <item name="nomStyle"/>
    <item name="descriptionStyle"/>
    <item name="backgroundcolor"/>
    <item name="background-image" xsi:type="xsd:base64Binary" filename="" content-type=""/>
    <item name="Selectedcolor"/>
    <item name="textStyle">
    		<item name="font-family"/>
    		<item name="font-size"/>
    		<item name="font-color"/>
    </item>
    …..

    Donc comme ça je peut économise le document xslt que je vais crée et ça facilitera le traitement après
    Que pensez vous ?
    Est-ce que vous avez une autre idée ?
    Dernière modification par julp ; 21/03/2007 à 18h24.

  4. #4
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <item name="backgroundcolor"/>

    Je suppose que tu voudrais en fait:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <item name="background-color"/>

    A part ça, il n'y aura pas vraiment de changements (réduction de code) par rapport à l'ancien format (1er post), au niveau du xslt. Toujours en supposant que:


    Est en fait:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <background-color/>

    La fonction xpath name() retourne le nom de la balise donc c'est (je pense) plus intuitif de nommer correctement les balises plutôt que les attributs name et n'avoir que des balises item.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Pour
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <item name="backgroundcolor"/>
    C’est juste une faute de frappe mais ce que je veux par la c’est que l’attribut name prend le nom de la balise css
    Bon voila j’ai fait un truc en xslt

    Code XML : 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
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
     <xsl:output method="text"  omit-xml-declaration = "yes"/>
     <xsl:strip-space elements="*"/>
     <xsl:template match="/item">
    	<xsl:for-each select="descendant::item">
    		<xsl:variable name="courant" select="@name"/>
    		<xsl:choose>
    			<xsl:when test="$courant != 'style' ">
    				<xsl:variable name="parent" select="@name"/>
    			</xsl:when>
    			<xsl:when test="$courant = 'style' ">
    				.<xsl:value-of select ="$parent"/>{
    					<xsl:for-each select="./item">
    						<xsl:value-of select="@name"/>:<xsl:value-of select="@value" />;
    					</xsl:for-each>	
    				}
    			</xsl:when>
    		</xsl:choose>
    	 </xsl:for-each>
    </xsl:stylesheet>

    Le problème ici c’est que la variable

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="parent" select="@name"/>

    Que je déclare a l’intérieur de when n’est reconnu qu’a l’intérieur de la balise when mais moi j’en est besoin pour localise l’élément parent dans l’arbre xml qui est comme suit

    Code XML : 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"?>
    <?xml-stylesheet type="text/xsl" href="XmlToCss.xsl"?>
    		<item name="body">
    			<item name="headbody">
    				<item name="logo">
    					<item name="style">
    						<item name="nomStyle" value="test"/>
    						<item name="descriptionStyle" value="test"/>
    						<item name="backgroundcolor" value="test"/>
    					</item>
    				</item>
    					<item name="animation"></item>
    						<item name="infoprofil">
    							<item name="nom"/>
    							<item name="prenom"/>
    							<item name="login"/>								
    						</item>
    			</item>
    		</item>


    j'ai chercher sur le net et j'ai trouver une solution qui dit de faire comme suit

    Code XML : 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
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
     <xsl:output method="text"  omit-xml-declaration = "yes"/>
     <xsl:strip-space elements="*"/>
     <xsl:template match="/item">
     
    	<xsl:for-each select="descendant::item">
    		<xsl:variable name="courant" select="@name"/>	
    		<xsl:variable name="parent"> 		
    		<xsl:choose>
    			<xsl:when test="$courant != 'style' ">
    				<xsl:value-of select="@name"/>
    			</xsl:when>
    			<xsl:when test="$courant = 'style' ">
    				.<xsl:value-of select ="$parent"/>{
    						<xsl:for-each select="./item">
    							<xsl:value-of select="@name"/>:<xsl:value-of select="@value" />;
    						</xsl:for-each>	
    				}				
    			</xsl:when>
    		</xsl:choose>
    		</xsl:variable> 
    	 </xsl:for-each>
     
    	</xsl:template>
    </xsl:stylesheet>

    mais ca marche toujour pas
    et j'ai ca comme erreur :
    Impossible de résoudre une référence à une variable ou un paramètre « test ». La variable ou le paramètre ne sont peut être ...
    qui veut dir qu'il connait pas la variable parent
    Je sais pas si y’a une méthode pour résoudre ce problème en tous cas si vous avez une solution ça va beaucoup m’aider

    PS : je voit que le problème s’éloigne de php et entre dans xslt je sais pas si je doit refaire le sujet au niveau de la partie xslt ou je laisse ici
    Dernière modification par julp ; 22/03/2007 à 18h12.

  6. #6
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Avec le dernier exemple de xml et xsl que tu donnes, j'en déduis que l'output recherché est ceci:

    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    .logo { 
      nomStyle:test;
      descriptionStyle:test;
      backgroundcolor:test;
    }

    Dans ce cas, voici un xsl qui permet d'arriver à cet output:

    Code xml : 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 version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="text" omit-xml-declaration = "yes"/>
      <xsl:strip-space elements="*"/>
     
      <xsl:template match="/item">
        <xsl:apply-templates select=".//item[@name = 'style']"/>
      </xsl:template>
     
      <xsl:template match="item[@name = 'style']">
        .<xsl:value-of select="../@name"/> { <!-- 'logo' -->
        <xsl:for-each select="item">
          <xsl:value-of select="@name"/>:<xsl:value-of select="@value" />;
        </xsl:for-each>
        }
      </xsl:template>
     
    </xsl:stylesheet>

    Le 'parent::@name' est directement computé à l'intérieur de la template qui gère le style css.

    Comme tu sembles être en mesure de modifier la structure du xml (ce que je ne savais pas dans ton premier post), alors je pense que tu devrais correctement distribuer et nommer les balises et les attributs. N'avoir que des balises 'item' me paraît être une abération ; ) Utiliser judicieusement divers noms pour les balises simplifiera grandement l'écriture du xsl ainsi que la transformation en elle-même.

  7. #7
    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,

    Citation Envoyé par goodpz
    Le 'parent::@name' est directement computé à l'intérieur de la template qui gère le style css.
    Juste pour signaler que parent::@name n'est pas syntaxiquement correct (ça ferait deux axes, parent et attribute, appliqués en même temps). ../@name est en fait l'abbreviation de parent::*/attribute::name.
    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

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Enfin je vois mon fichier CSS complet sans fautes générer à partir document xml
    Merci pour tous
    Bonne journée

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

Discussions similaires

  1. 1 fichier xml vers plusieurs fichiers xml.
    Par gryps dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 05/11/2012, 13h58
  2. Decomposé un fichier XML en plusieurs fichiers XML sous python
    Par elhout dans le forum Général Python
    Réponses: 6
    Dernier message: 12/03/2007, 14h20
  3. [XSLT] transfo d'un fichier XML en plusieurs fichiers XML
    Par doudou_rennes dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 28/11/2006, 12h01
  4. [XSLT]transformer un fichier XML en en fichier XML
    Par alexandra dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 16/08/2006, 14h26
  5. Réponses: 4
    Dernier message: 31/07/2006, 09h31

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