Problème XSL

Bonjour,

J’ai un problème de transformation XSL, et je ne trouve pas de source pour ce genre de chose.

Voici le contexte, j’ai des balises de la forme :


<p>
   AAA
   <lb />
   BBB
   <lb />
   CCC
</p>

Et je voudrais les transformer en :


<p>AAA</p>
<p>BBB</p>
<p>CCC</p>

Et je ne vois pas comment. Quelqu’un saurait le faire ? Merci.

Il suffit de remplacer par

, non ?
Tu peux le fiaire directement sur la source, en mode texte, par exemple avec sed

Non ce n’est pas possible.

Primo car si tu finis par un devant un

, ton fichier XML devient incorrect.
Secundo, parce que le fichier XSL est lui même invalide avec une telle règle.

Quant au script, le premier point reste valide. Et comme j’ai du XSL à faire, autant tout faire en XSL…

Mais merci quand même.

Quelqu’un sait le faire en XSL ?

<xsl:template name="split">
		<xsl:param name="string"/>
		<xsl:choose>
			<xsl:when test="contains($string,'<lb />')">
				<xsl:value-of select="substring-before($string,'<lb />')"/>
				<xsl:call-template name="split">
					<xsl:with-param name="string">
						<xsl:value-of select="substring-after($string,'<lb />')"/>
					</xsl:with-param>
				</xsl:call-template>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$string"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

Ca pourra surement t’aider, je ne l’ai pas tester et j’éspere que substring-after peut prendre une chaine de caracteres en second param.
Edité le 13/11/2007 à 15:10

Impeccable. Je vois bien ce que ça fait. Le reste n’est que de la reprise et de l’adaptation, et ça c’est à moi de le faire :slight_smile:

Merci beaucoup. :super:

Je reviendrai dire si ça a marché ou pas. Je n’ai pas forcément l’occasion de m’en occuper dans les heures qui viennent, mais je viendrai dire si ça marche ou pas. Ça aidera sûrement d’autres personnes…

J’ai essayé la méthode…
Le problème est que tel quel, ça ne marche pas.


extractInfoPresse.xsl:140: parser error : Unescaped '<' not allowed in attributes values
		<xsl:when test="contains($string,'<lb />')">
		                                  ^
extractInfoPresse.xsl:140: parser error : attributes construct error
		<xsl:when test="contains($string,'<lb />')">
		                                  ^
extractInfoPresse.xsl:140: parser error : Couldn't find end of Start Tag when line 140
		<xsl:when test="contains($string,'<lb />')">
		                                  ^
extractInfoPresse.xsl:142: parser error : Opening and ending tag mismatch: choose line 140 and when
		</xsl:when>
		           ^
extractInfoPresse.xsl:142: parser error : Opening and ending tag mismatch: template line 139 and choose
	</xsl:choose>
	             ^
extractInfoPresse.xsl:142: parser error : Opening and ending tag mismatch: stylesheet line 2 and template
</xsl:template>
               ^
extractInfoPresse.xsl:145: parser error : Extra content at the end of the document
</xsl:stylesheet>
^

J’ai essayé de remplacer par <lb /> mais ça ne marche pas non plus. Il ne détecte jamais la chaîne dans le texte.

EDIT : super, le forum interprète aussi les caractères codés…

Essayons avec la balise code :

<lb />

remplacé par

<lb />

EDIT : Forum de merde… Pardon, ça n’aide pas, mais ça soulage !

Bref, j’ai remplacé les chevrons par les entités associées : lt; et gt;
Edité le 19/11/2007 à 17:44

J’ai poussé un peu les tests, il s’avère que ça ne peut pas marcher tel quel…

Quand je remplace le test d’existence de chaîne par :


		<xsl:when test="contains($string,'lb')">

Soit un test plus simple (on teste juste l’existence du nom du tag, et non le taf lui-même).
Le résultat rend toujours faux. Donc la méthode “contains” ne marche pas sur les balises qui sont dans le texte…

:o(