Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels DOM
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/03/2007, 12h22   #1
Futur Membre du Club
 
Développeur informatique
Inscription : avril 2006
Messages : 42
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2006
Messages : 42
Points : 15
Points : 15
Envoyer un message via MSN à HrTsDi
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 :
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
HrTsDi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 20h08   #2
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
Tu pourrais utiliser une transformation xslt. Voici un code de départ:

Code :
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 :
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 :
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;
}
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 17h47   #3
Futur Membre du Club
 
Développeur informatique
Inscription : avril 2006
Messages : 42
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2006
Messages : 42
Points : 15
Points : 15
Envoyer un message via MSN à HrTsDi
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 :
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 ?
HrTsDi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 18h28   #4
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
Code xml :
<item name="backgroundcolor"/>

Je suppose que tu voudrais en fait:

Code xml :
<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 :
<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.
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2007, 14h53   #5
Futur Membre du Club
 
Développeur informatique
Inscription : avril 2006
Messages : 42
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2006
Messages : 42
Points : 15
Points : 15
Envoyer un message via MSN à HrTsDi
Bonjour

Pour
Code XML :
<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 :
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 :
<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 :
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 :
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 :
Citation:
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
HrTsDi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2007, 21h21   #6
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
Avec le dernier exemple de xml et xsl que tu donnes, j'en déduis que l'output recherché est ceci:

Code css :
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 :
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.
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2007, 09h21   #7
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
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
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2007, 10h49   #8
Futur Membre du Club
 
Développeur informatique
Inscription : avril 2006
Messages : 42
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2006
Messages : 42
Points : 15
Points : 15
Envoyer un message via MSN à HrTsDi
Bonjour,
Enfin je vois mon fichier CSS complet sans fautes générer à partir document xml
Merci pour tous
Bonne journée
HrTsDi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h08.


 
 
 
 
Partenaires

Hébergement Web