Bonjour,

dans mon document XML, j'ai un texte que je voudrais diviser en plusieurs paragraphes à l'aide d'une feuille de style XSLT. Le problème est que mon texte est dans une balise XML et quand je fais appel à catte valeur, je ne vois pas comment insérér des <p> ou des </p> à l'intérieur de cette valeur. Comment à t-on l'habitude de faire dans ce cas ?
Je crois, si jai bien compris, que ce que tu demandes à XSL va au-delà de ses capacités: c'est un langage informatique, donc il ne peut faire que ce qu'on lui dit de faire.

Tu voudrais que ton script détecte tout seul des blocs logiques dans ton gros élément de texte? Ce n'est pas possible. Pour lui, il ne s'agit que d'une succession de 0 et de 1.

Tu peux lui demander, en revanche, de scinder ce gros bloc en phrases en le découpant à chaque fois qu'il rencontre un point (., ?, !, ...). Ou bien q'il découpe en bloc de n phrases. C'est tout.
a écrit :
Tu peux lui demander, en revanche, de scinder ce gros bloc en phrases en le découpant à chaque fois qu'il rencontre un point (., ?, !, ...). Ou bien q'il découpe en bloc de n phrases. C'est tout.


Cela pourrait être une solution, puisque dans mon XML, à chaque fois que dans un texte il y a crétion d'un nouveua paragraphe, il y a le caractère suivant : â&#8364;© (en ASCII ?). Comment faire alors pour le détécter et découper le texte à ce niveau là avec du XSL ?

En règle général, comment à t-on l'habitude de faire si l'on veux afficher un texte (stocké dans du XML) avec plusieurs paragraphes ? Faut-il nécéssairement que chaque paragraphe du texte soit placé dans des balises XML différentes ?
Bonjour!

Tu peux utiliser des fonctions d'extraction de chaînes comme substring, substring-after et substring-before dans un template récursif (qui s'appelle eux-mêmes).

Voici un petit algo rapide:
le template prend en argument une chaîne de caractères. Il cherche la première occurence du ., de ! ou de ? (attention aux points de suspension). Si elle existe, il récupère la chaîne de caractères qui est juste avant et l'entoure des balises de ton choix. Il passe ensuite la chaîne de caractères suivant ce caractère de référence à... lui-même en s'auto-appelant.
S'il ne détecte pas le caractère de référence, il arrête le processus et traite la chaîne restante.
Modifié par Gilles (21 Feb 2006 - 09:28)
Oui ça me conviendrait. Smiley smile

Mais comment faire pour chercher la première occurence du ., de ! ou de ? Smiley confus

Evidement, je pourrais faire une template récursive et utiliser les fonctions starts-with() et substring() mais comme on ne peux même pas incrémenter les variables avec XSLT, il faudrait alors que j'utilise string-length() pour pouvoir enfin déterminer la position de mon caractère... c'est un peu lourd ! Smiley ohwell

A moins que tu n'ai une solution meilleure ?
Modifié par mathmax (26 Feb 2006 - 01:28)
bonjour,

un code non testé :
définis les deux template suivants



	<xsl:template name="creerParagraphes">
		<xsl:param name="string"/>
		<xsl:choose>
			<xsl:when test="contains($string,'&#xA;')">
				<p>
					<xsl:value-of select="substring-before($string,'&#xA;')"/>
				</p>
				<xsl:call-template name="creerParagraphes">
					<xsl:with-param name="string">
						<xsl:value-of select="substring-after($string,'&#xA;')"/>
					</xsl:with-param>
				</xsl:call-template>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$string"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>
	
	<xsl:template name="AfficheAvecParagraphes">
		<xsl:param name="chaine"/>
		<xsl:variable name="Resultat">
			<xsl:call-template name="creerParagraphes">
				<xsl:with-param name="string" select="$chaine"/>
			</xsl:call-template>
		</xsl:variable>
		<xsl:copy-of select="$Resultat"/>
	</xsl:template>


et appel AfficheAvecParagraphes avec la chaîne que tu veux :

<xsl:call-template name="CopieAvecSautLigne">
		<xsl:with-param name="chaine" select="unNoeud"/>
	</xsl:call-template>