Bonjour tout le monde,

Je voudrai modifier un caractère particulier (§) dans fichier xml par un ensemble de balises (</p><p>)... Je vous propose un exemple :
- en entrée

<p>Le premier paragragraphe.§Le second paragraphe.</p>

- en sortie

<p>Le premier paragragraphe.</p>
<p>Le second paragraphe.</p>


Il est très facile de faire la chose avec php Smiley cligne ... mais je désire faire ceci via une transformation xslt

Si une ame charitable veut bien se pencher sur mon problème
Je vous remercie
Djaps
Intéressant,

Après quelques recherches Smiley smile


      <xsl:if test="contains(p,§)"> 
//la requete contains regarde si l'élément p contient le charactère "§", renvoi true si oui, false sinon
          <xsl:value-of select="substring-before(p,§)"/>  
//on récupere le texte AVANT le char "§" dans l'élément p (<p>)
                     </p><p> //on ajoute ton ensemble de balise
         <xsl:value-of select="substring-after(p,§)"/>  
//on récupere le texte APRES le char  "§" dans l'élément p (<p>)
      </xsl:if>


Voila, un petit début, j'essayerai de repasser pour nettoyer la syntaxe mais la logique est là.

Edit : petit nettoyage de syntaxe Smiley smile

J'en profite pour te dire que <p> est une balise html alors que ton fichier est censé être écris en xml, bien sur il est possible d'utiliser du html dans du xml mais néamoins fait attention à la confusion.

PS : je n'ai pas tester mais il va peut être te falloir mettre de quotes autours de §
<xsl:if test="contains(p,'§')">
pour que xsl comprenne que tu parle d'une chaine de charactère, à toi de complèter.
Modifié par Kahor (24 Jun 2008 - 17:28)
Je te remercie pour ta réponse

a écrit :
</p><p> //on ajoute ton ensemble de balise

Le problème de cette méthode (je n'ai pas testé) est que l'on ferme une balise avant de l'ouvrir... -> la strucure xml ne semble pas être respectée

J'ai réussi à faire ce que je voulais.
Je t'offre le fruit de mes recherches (mon résultat...)

Voici le fichier xsl
<?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="html" media-type="text/html; charset=ISO-8859-1"/>
	
	<xsl:template name="paragraphe">
		<xsl:param name="texte" />
		<p>
			<xsl:choose>
      		<xsl:when test="contains($texte, '§')">
      			<xsl:value-of select="substring-before($texte,'§')" />
			<xsl:if test="string-length(substring-after($texte,'§')) > 0"> 
				<xsl:call-template name="paragraphe">
				<xsl:with-param name="texte" select="substring-after($texte,'§')" /> 
				</xsl:call-template>
			</xsl:if>
		</xsl:when> 
		<xsl:otherwise>
			<xsl:value-of select="$texte"/>  
		</xsl:otherwise>
			</xsl:choose>        
		</p>
	</xsl:template>
	
	<xsl:template match="//p">
		<html><body>
		<xsl:if test="boolean(fr/@h)">
   		<h3><xsl:value-of select="fr/@h"/></h3>
		</xsl:if>
		<xsl:call-template name="paragraphe">
			<xsl:with-param name="texte" select="fr" />
		</xsl:call-template>
		</body></html>
	</xsl:template>
	
</xsl:stylesheet>


avec un fichier xml de ce type...
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="www.xsl"?>
<!DOCTYPE root [
<!ELEMENT root (p*)>
<!ELEMENT p ( fr? , en? )>
<!ELEMENT fr (#PCDATA)>
<!ATTLIST fr h CDATA #IMPLIED>
<!ELEMENT en (#PCDATA)>
<!ATTLIST en h CDATA #IMPLIED>
]>
<root>
<p>
	<fr h="Un titre">Un pragraphe§Un second§Un troisième</fr>
	<en/>
</p>
</root>


Voilà,
Djaps
Modifié par djaps (24 Jun 2008 - 17:52)
djaps a écrit :
Je te remercie pour ta réponse

</p><p> //on ajoute ton ensemble de balise

Le problème de cette méthode (je n'ai pas testé) est que l'on ferme une balise avant de l'ouvrir... -> la strucure xml ne semble pas être respectée


Je ne suis pas sur de comprendre l'erreur Smiley smile

Tu veux dire par la que ton charactère spécial ne se trouve pas forcément directement dans un élément <p> mais peu apparaître dans un sous élément de l'élément <p> ?