Bonjour,

à l'intérieur d'une de mes balises j'ai un text qui contient ou non un ou plusieurs _ et j'aimerais les remplacer par une balise <div/>. Comment procéder ?

Avec des substring? Mais comment?

Vous me conseilleriez plutot de faire ca en code?

J'aimerais bien que vous me donniez votre avis!

Merci

Thierry
Bonjour,

je ferais personnellement comme ceci :
1/ définir un paramètre (ou plusieurs selon ton besoin) contenant la chaîne à mettre dans ta div. substring-before() et substring-after() conviennent bien pour obtenir cette chaîne.
2/ appeller avec le paramètre un template dont le rôle sera de créer le noeud <div> avec son contenu.
Modifié par Xavier (19 Jan 2006 - 11:04)
virgul a écrit :
Bonjour,

à l'intérieur d'une de mes balises j'ai un text qui contient ou non un ou plusieurs _ et j'aimerais les remplacer par une balise <div/>. Comment procéder ?

Avec des substring? Mais comment?

Vous me conseilleriez plutot de faire ca en code?

J'aimerais bien que vous me donniez votre avis!

Merci

Thierry


Bonjour,

Je ne suis pas sûr de bien comprendre... Quand tu dis "à l'intérieur d'une balise", tu parles d'un attribut? Ou bien peut-être confonds-tu balise et élément?

Pourrais-tu nous montrer un exemple de code (en n'oubliant pas de le formatter conformément aux règles du forum. Merci!
Merci pour l'intérêt!

ok je me suis peut-être mal exprimé soit

le xml de départ:

<M>J'aime manger:_des canelloni_des saucisses_des steak</M>


Le xml souhaité:
<M>J'aime manger:<div/>des canelloni<div/>des saucisses<div/>des steak</M>


Comme je le disais précédement je ne sais pas si ma balise contient un _ ni le nombre s'il y en a!

Merci Smiley cligne

Thierry
Modifié par virgul (19 Jan 2006 - 11:22)
Le xml souhaité ne prend pas le chemin d'un fragment de xhtml valide, mais bon ce n'est peut être pas le but ?

Sinon, les éléments de ma première réponse restent bons, il faut néanmoins ajouter une couche de récursivité en définissant un template qui aura les fonctionalités suivantes :
- rechercher le premier _
- extraire la chaîne devant le _
- transformer le _ en élément div.
- extraire la chaîne dernière le premier _
- faire un appel réentrant de mon template sur cette dernière chaîne
a écrit :
Le xml souhaité ne prend pas le chemin d'un fragment de xhtml valide, mais bon ce n'est peut être pas le but ?


si mais faut juste que je rajoute le déclaration du namespace en plus pour que ca marche (xmlns="http://www.w3.org/1999/xhtml") avec Microsoft Office Infopath!

Sinon voici mon premier jet :


<?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" version="1.0" encoding="UTF-8" indent="yes"/>
	<xsl:template match="/">
		<xsl:apply-templates select="M"/>
	</xsl:template>
	<xsl:template match="M">
		<xsl:choose>
		<xsl:when test="contains(. , '_')">
		<xsl:element name="{local-name()}">
		<xsl:value-of select="substring-before(., '_')"/>
		<div/>
		<xsl:value-of select="substring-after(. , '_')"/>
		</xsl:element>
			</xsl:when>
			<xsl:otherwise>
				<xsl:copy-of select="."/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>


Mais ca ne traite qu'un _ Smiley sweatdrop .

a écrit :
- faire un appel réentrant de mon template sur cette dernière chaîne


Comment faire pour faire ca?

Merci beaucoup pour ton aide!
Tu dois créer un template spécifique pour traiter une chaîne.
Ce template prend en entrée un paramètre contenant la chaîne à transformer, et produit en sortie un arbre contenant les noeuds texte et <div/>.

Ce template s'appelle lui même avec la chaîne issue de ton
<xsl:value-of select="substring-after(. , '_')"/>
Il en résulte un traitement récursif qui produit le résultat attendu en exploitant pleinement XSLT.
Merci pour ta réponse:

Xavier a écrit :
Tu dois créer un template spécifique pour traiter une chaîne.
Ce template prend en entrée un paramètre contenant la chaîne à transformer, et produit en sortie un arbre contenant les noeuds texte et <div/>.

Ce template s'appelle lui même avec la chaîne issue de ton
<xsl:value-of select="substring-after(. , '_')"/>
Il en résulte un traitement récursif qui produit le résultat attendu en exploitant pleinement XSLT.


Désolé mais là, je ne comprends pas trop ce que tu essayes de me faire comprendre??? Smiley confus

Pourrais-tu m'expliquer un peu plus en détail comment procéder? Smiley confused

Merci mille fois
Modifié par virgul (20 Jan 2006 - 15:30)
Ce template récursif produit un sous arbre que tu dois insérer dans ton élément <M/> :
<xsl:template name="decomposition-chaine">
 <xsl:param name="chaine"/>
   ... traitement début de chaîne...
   <xsl:call-template name="decomposition-chaine" >
	<xsl:with-param name="chaine" select="substring-after($chaine , '_')"/>
   </xsl:call-template>
</xsl:template>
Ok nickel ca marche super ton idée voici mon résultat:

<?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" version="1.0" encoding="UTF-8" indent="yes"/>
	<xsl:template match="/">
		<xsl:apply-templates select="M"/>
	</xsl:template>
	<xsl:template match="M">
		<xsl:choose>
			<xsl:when test="contains(. , '_')">
				<xsl:element name="{local-name()}">
				<xsl:call-template name="decomposition-chaine">
				<xsl:with-param name="chaine" select="."/>
				</xsl:call-template>
				</xsl:element>
			</xsl:when>
			<xsl:otherwise>
				<xsl:copy-of select="."/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	<xsl:template name="decomposition-chaine">
		<xsl:param name="chaine"/>
		<xsl:value-of select="substring-before($chaine,'_')"/>
		<xsl:if test="contains($chaine,'_')">
		<div/>
		<xsl:call-template name="decomposition-chaine">
	<xsl:with-param name="chaine" select="substring-after($chaine , '_')"/>
		</xsl:call-template>
		</xsl:if>
	</xsl:template>
</xsl:stylesheet>


Maintenant il ne me reste plus qu'a inclure ca dans un autre XSLT cf: ce topic

Je te donne des nouvelles si je n'y arrive pas!

Merci encore une fois!

++

Thierry
Modifié par virgul (20 Jan 2006 - 15:53)
Ben j'y suis pas arrivé trop déçu... Smiley decu Smiley bawling Smiley fache

Donc je doit une fois de plus sollicité votre aide comment faire pour mixer ces deux XSLT? Sachant que si ca on les passe l'un après l'autre ca ne marche pas

Pour le premier XSLT regardez le message d'en dessus Smiley winner

Pour le second il s'agit de celui-ci:
<?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" version="1.0" encoding="UTF-8" indent="yes"/>
		<xsl:template match="/">
		<xsl:apply-templates/>
	</xsl:template>
	<xsl:template match="*">
		<xsl:element name="{local-name()}">
			<xsl:apply-templates select="@*|node()"/>
		</xsl:element>
	</xsl:template>
	<xsl:template match="@*">
		<xsl:attribute name="{local-name()}">
                          <xsl:value-of select="."/></xsl:attribute>
	</xsl:template>
<xsl:template match="B">
<xsl:variable name="nom" select="@id"/>
<xsl:element name="b" namespace="http://www.w3.org/1999/xhtml">
<xsl:attribute name="title"><xsl:value-of select="@Des"/></xsl:attribute>
<xsl:attribute name="style"/><xsl:attribute name="id">B</xsl:attribute>
<xsl:value-of select="."/>^</xsl:element>
</xsl:template>
<xsl:template match="N">
<xsl:variable name="nom" select="@id"/>
<xsl:element name="b" namespace="http://www.w3.org/1999/xhtml">
<xsl:attribute name="title"><xsl:value-of select="@Des"/></xsl:attribute>
<xsl:attribute name="style"/><xsl:attribute name="id">N</xsl:attribute>
<xsl:value-of select="."/>^</xsl:element>
</xsl:template>
<xsl:template match="D">
<xsl:element name="b" namespace="http://www.w3.org/1999/xhtml">
<xsl:attribute name="title"><xsl:value-of select="@Des"/></xsl:attribute>
<xsl:attribute name="style"/><xsl:attribute name="id">D</xsl:attribute>
<xsl:value-of select="."/>^</xsl:element>
</xsl:template>
<xsl:template match="T">
<xsl:element name="b" namespace="http://www.w3.org/1999/xhtml">
<xsl:attribute name="title"><xsl:value-of select="@Des"/></xsl:attribute>
<xsl:attribute name="style"/><xsl:attribute name="id">T</xsl:attribute>
<xsl:value-of select="."/>^</xsl:element>
</xsl:template>
</xsl:stylesheet>


sachant que le XML est du genre:

<tabMuster Amt='0'>
<Modele fldID="102">
		<Des>Mehrere Übersetzungen aufgehoben</Des>
		<Muster>[Die Übersetzungen der Firma sind aufgehoben worden.]</Muster>
		<Text>[Die Übersetzungen der Firma sind aufgehoben worden.]</Text>
	</Modele>
	<Modele fldID="115">
		<Des>Bäulerstrasse, Rümlang</Des>
		<Muster>Bäulerstrasse <T Des="ein Text"/>_Rümlang_8152 Glattbrugg {eigene Büros}</Muster>
		<Text>Bäulerstrasse ^_Rümlang_8152 Glattbrugg {eigene Büros}</Text>
	</Modele>
	<Modele fldID="115">
		<Des>Bäulerwiesenstrasse, Rümlang</Des>
		<Muster>Bäulerwiesenstrasse <T Des="ein Text"/>_Rümlang_8152 Glattbrugg {eigene Büros}</Muster>
		<Text>Bäulerwiesenstrasse ^_Rümlang_8152 Glattbrugg {eigene Büros}</Text>
	</Modele>
	<Modele fldID="115">
		<Des>Eichstrasse, Rümlang</Des>
		<Muster>Eichstrasse <T Des="ein Text"/>_Rümlang_8152 Glattbrugg {eigene Büros}</Muster>
		<Text>Eichstrasse ^_Rümlang_8152 Glattbrugg {eigene Büros}</Text>
	</Modele>
</tabMuster>


OK donc le but est d'avoir en sortie:

<Modele fldID="115">
		<Des>Eichstrasse, Rümlang</Des>
		<Muster>Eichstrasse <b xmlns="http://www.w3.org/1999/xhtml" title="ein Text" style="" id="T">^</b><div/>Rümlang<div/>8152 Glattbrugg {eigene Büros}</Muster>
		<Text>Eichstrasse ^_Rümlang_8152 Glattbrugg {eigene Büros}</Text>
	</Modele>


Merci infiniment pour votre aide très appréciable!

Thierry
Re-bonjour,

Je sais que mon dernier problème est très spécifique à mon problème et n'éveille pas forcément en vous la curiosité!

Mais là je bloque vraiment! Smiley sweatdrop Je commence même à me demander si c'est possible de mixer ces 2 xslt!

Es-ce que vous pensez que c'est réalisable? oui, non Smiley help

D'avance, merci !

Thierry
Modifié par virgul (24 Jan 2006 - 15:40)
Bonsoir,

Sincèrement il y a trop de code dans tout les sens, et des explications sur plusieurs posts, pour regarder cela rapidement.
Si tu pouvais batir un exemple très simple de ce qui ne va pas, tu aurais plus de chance d'avoir une réponse.
Un petit effort...
Merci pour le conseil!
Ok on va donc essayé de récapituler simplement:

soit mon XML:
<?xml version="1.0" encoding="UTF-8"?>
<M>Eichstrasse <T Des="ein Text"/>_Rümlang_8152 Glattbrugg {eigene Büros}</M>

Comme un grand malin je me suis dit que je pouvais essayé de faire 2 XSLT pour faire mes transformation!
Un pour transformé ca:
<[#red]T[#black] Des="[#blue]ein Text[#black]"/>

en ca (tout ce qui n'est pas en couleur se transforme génériquement possibilités: T, B, N et D, avec @Des différentes):
<b xmlns="http://www.w3.org/1999/xhtml" title="[#blue]ein Text[#black]" style="" id="[#red]T[#black]">^</b>

et l'autre pour transformer mes _ en <div/>!

Le seul problème est que maintenant j'arrive à faire mes transformation mais une enlève les balises de l'autre!

D'ou ma question comment pourrais-je faire pour que me deux transformation soie soit en un ou deux pas mais quelle ne s'annule pas?

Pour rappel voici les 2 XSLT (Adapté au xml présenté en dessus):
1:
<?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" version="1.0" encoding="UTF-8" indent="yes"/>
		<xsl:template match="/">
		<xsl:apply-templates/>
	</xsl:template>
	<xsl:template match="M">
		<xsl:element name="{local-name()}">
			<xsl:apply-templates select="@*|node()"/>
		</xsl:element>
	</xsl:template>
	<xsl:template match="@*">
		<xsl:attribute name="{local-name()}"><xsl:value-of select="."/></xsl:attribute>
	</xsl:template>
<xsl:template match="B">
<xsl:variable name="nom" select="@id"/>
<xsl:element name="b" namespace="http://www.w3.org/1999/xhtml"><xsl:attribute name="title"><xsl:value-of select="@Des"/></xsl:attribute><xsl:attribute name="style"/><xsl:attribute name="id">B</xsl:attribute><xsl:value-of select="."/>^</xsl:element>
</xsl:template>
<xsl:template match="N">
<xsl:variable name="nom" select="@id"/>
<xsl:element name="b" namespace="http://www.w3.org/1999/xhtml"><xsl:attribute name="title"><xsl:value-of select="@Des"/></xsl:attribute><xsl:attribute name="style"/><xsl:attribute name="id">N</xsl:attribute><xsl:value-of select="."/>^</xsl:element>
</xsl:template>
<xsl:template match="D">
<xsl:element name="b" namespace="http://www.w3.org/1999/xhtml"><xsl:attribute name="title"><xsl:value-of select="@Des"/></xsl:attribute><xsl:attribute name="style"/><xsl:attribute name="id">D</xsl:attribute><xsl:value-of select="."/>^</xsl:element>
</xsl:template>
<xsl:template match="T">
<xsl:element name="b" namespace="http://www.w3.org/1999/xhtml"><xsl:attribute name="title"><xsl:value-of select="@Des"/></xsl:attribute><xsl:attribute name="style"/><xsl:attribute name="id">T</xsl:attribute><xsl:value-of select="."/>^</xsl:element>
</xsl:template>
</xsl:stylesheet>

2:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
	<xsl:template match="/">
		<xsl:apply-templates/>
	</xsl:template>
	<xsl:template match="M">
		<xsl:choose>
			<xsl:when test="contains(. , '_')">
				<xsl:element name="{local-name()}">
				<xsl:call-template name="decomposition-chaine">
				<xsl:with-param name="chaine" select="."/>
				</xsl:call-template>
				</xsl:element>
			</xsl:when>
			<xsl:otherwise>
				<xsl:copy-of select="."/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	<xsl:template name="decomposition-chaine">
		<xsl:param name="chaine"/>
		<xsl:value-of select="substring-before($chaine,'_')"/>
		<xsl:if test="contains($chaine,'_')">
			<div xmlns:xhtml="http://www.w3.org/1999/xhtml"/>
			<xsl:call-template name="decomposition-chaine">
			<xsl:with-param name="chaine" select="substring-after($chaine , '_')"/>
			</xsl:call-template>
		</xsl:if>
	</xsl:template>
</xsl:stylesheet>

J'espère que ce sera un peu plus claire!

Merci infiniment!

Thierry
Modifié par virgul (25 Jan 2006 - 08:32)
Si tu as 2 XSLT qui fonctionnent, le plus simple (pas le plus élégant j'en conviens) c'est de les passer en séquence comme ceci :
XML source + XSLT1 --> XML intermédiaire + XSLT2 --> XML final

Sinon tu implémentes tes fonctionnalités dans des templates que tu pourras appliquer librement. Le premier template n'alimente pas l'arbre résultat mais une variable qui sert de paramètre pour le second template qui lui construit l'arbre résultat. De cette façon tu peux chaîner tes 2 traitements.
Merci pour ta réponse!

a écrit :
Si tu as 2 XSLT qui fonctionnent, le plus simple (pas le plus élégant j'en conviens) c'est de les passer en séquence comme ceci :
XML source + XSLT1 --> XML intermédiaire + XSLT2 --> XML final


Ca ca ne marche pas un efface le résultat obtenu par l'autre! Donc pas possible! Je m'en serais contenté dans un premier temps!

a écrit :
Sinon tu implémentes tes fonctionnalités dans des templates que tu pourras appliquer librement. Le premier template n'alimente pas l'arbre résultat mais une variable qui sert de paramètre pour le second template qui lui construit l'arbre résultat. De cette façon tu peux chaîner tes 2 traitements.


Je ne vois pas trop comment faire ca vu qu'il se détruise l'un l'autre???
Tes 2 fonctionnalités ciblent des "objets" disjoints, donc logiquement les deux possibilités que je propose fonctionnent.

Je n'ai pas regardé tes transformées, mais si l'une "efface" le travail de l'autre, le cas est tellement énorme, tellement "impossible" (j'ai mis des guillemets, c'est juste pour dire que ça défit la logique) que :
- soit tu as un bug énorme que tu trouveras facilement si tu cherches comment ta seconde transformée rétablit à l'envers ce que la première à fait
- soit tu crois avoir passé la seconde sur la première, mais c'est une croyance qui n'est pas la réalité.

Personnellement je penche pour la seconde hypothèse.
Regarde à tout hasard ce qui se passe si tu inverses l'ordre des transformées.