[xml+xsl] insertion de saut de ligne ?

insertion de saut de ligne ? [xml+xsl] - XML/XSL - Programmation

Marsh Posté le 02-08-2004 à 11:13:32    

Bonjour
 
dans une balise xml j'ai du texte que je traite ensuite avec xsl.
 
Comment faire pour gérer le retour à la ligne et le saut de ligne pour ce texte (dans le xml) ?
 
merci d'avance


---------------
nos utopies d'aujourd'hui sont les réalités de demain.
Reply

Marsh Posté le 02-08-2004 à 11:13:32   

Reply

Marsh Posté le 02-08-2004 à 14:22:32    

pas possible a mon sens
 
mais si tu traite ton fichier avec php (ou un autre langage) tu auras surement une fonction nl2br() qui se charge de convertir les saut de ligne en balise(en l'occurence <br> ou <br /> selon la sortie demandée).

Reply

Marsh Posté le 03-08-2004 à 13:07:45    

up


---------------
nos utopies d'aujourd'hui sont les réalités de demain.
Reply

Marsh Posté le 11-10-2004 à 11:39:53    

j'ai le même pb. La balise <br />, lors de la transformation xsl, est zappée :(. Je précise que mon but est de faire xml + xsl = fichier html en sortie


Message édité par rufo le 11-10-2004 à 11:40:50
Reply

Marsh Posté le 11-10-2004 à 11:56:55    

La balise <br/> est-elle correctement protégée ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 11-10-2004 à 13:21:48    

sircam a écrit :

La balise <br/> est-elle correctement protégée ?


on la protège comment? Car je n'ai rien fait de particulier pour la protéger...

Reply

Marsh Posté le 11-10-2004 à 16:01:58    

j'ai essayé en mettant &lt;br />&gt; mais c'est pas ça pour protéger...

Reply

Marsh Posté le 12-10-2004 à 08:52:20    

up :)

Reply

Marsh Posté le 13-10-2004 à 09:10:38    

j'ai toujours pas trouvé comment "protéger" ma balise <br /> :(... sircam, on fait ça comment, svp? Merci beaucoup :jap:

Reply

Marsh Posté le 13-10-2004 à 15:14:28    

Essaie la balise <p/> dans le fichier xsl a l'endroit ou tu veux sauter une ligne.

Reply

Marsh Posté le 13-10-2004 à 15:14:28   

Reply

Marsh Posté le 14-10-2004 à 10:31:02    

mon pb n'est pas que je ne peux pas mettre de balises <br /> dans mon xsl. Mon pb est que dans mon flux xml, j'ai certains champs (balises) qui contiennent du texte dans lequel j'ai des sauts de lignes.
 
ex : <description>un texte assez long.<br />Je veux sauter une ligne.</description>
 
Lors de la transformation xslt, la balise <br /> saute :( je ne sais pas comment faire pour avoir au final mes sauts de lignes dans les longs paragraphes...

Reply

Marsh Posté le 18-10-2004 à 13:28:09    

up :)

Reply

Marsh Posté le 20-10-2004 à 12:36:47    

y'a personne qui peut m'aider? :(

Reply

Marsh Posté le 25-10-2004 à 13:26:31    

je désespère de trouver une solution à ce pb...

Reply

Marsh Posté le 26-10-2004 à 10:17:19    

Il y a une série d'articles très intéressant à ce sujet sur www.xml.com
 
http://www.xml.com/pub/a/2001/11/07/whitespace.html
 

Reply

Marsh Posté le 27-10-2004 à 09:21:09    

Merci. Je vais regarder :)

Reply

Marsh Posté le 27-10-2004 à 09:42:50    

One handy trick that gets around this indenting problem and makes stylesheets more readable is to declare a general entity that has an xsl:text element with a space or carriage return as its contents and then to reference that entity in the document. This next version of the stylesheet does this for both characters and references these entities to put a carriage return after the hireDate value and a space after the first value.

Code :
  1. <!-- xq537.xsl: converts xq528.xml into xq538.txt -->
  2. <!DOCTYPE stylesheet [
  3. <!ENTITY space "<xsl:text> </xsl:text>">
  4. <!ENTITY cr "<xsl:text>
  5. </xsl:text>">
  6. ]>
  7. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  8.      version="1.0">
  9. <xsl:output method="xml" omit-xml-declaration="yes"/>
  10. <xsl:template match="employee">
  11.   <xsl:apply-templates select="@hireDate"/>&cr;
  12.   <xsl:apply-templates select="first"/>&space;
  13.   <xsl:apply-templates select="last"/>
  14. </xsl:template>
  15. </xsl:stylesheet>


 
The result has the carriage return and space right where the entity references put them.  
 

Code :
  1. 09/01/1998
  2. Johnny Herbert


 
Je pense que ça devrait résoudre mon pb :)))

Reply

Marsh Posté le 27-10-2004 à 11:01:46    

Bon, ben enfin de compte, la méthode ci-dessus ne marche pas quand le contenu de ma balise est  

Code :
  1. <description>mon texte avec des entités &cr; pour remplacer les balises <br /></description>


 :(
 
ça marche uniquement si je mets les &cr; dans la feuille xsl...
 
La solution est la suivante.

Code :
  1. <description>mon texte avec des <![CDATA[<br >]]> pour remplacer les balises <br /></description>


 
c'est un peut lourd, mais ça marche :)

Reply

Marsh Posté le 06-11-2004 à 01:30:00    

je suis heureux de trouver quelqu'un qui a réussi à faire reconnaître un retour à la ligne  
 
dans un texte entre 2 balises xml.
ex : <texte> suite de mots ...passage à la ligne... suite de mots </texte>
malheureusement j'ai du mal comprendre car moi je n'y reussis pas encore :  
que je remplace ...passage à la ligne... par &cr; mon texte n'est plus interprété  
quand je remplace ...passage à la ligne... par <![CDATA[<br >]]> le retour ne se fait  
 
toujours pas mais j'ai un <br /> écrit à la place ...  
 
:ouch:  
j'ai dù oublier qquechose ! mais quoi ?
 
faut-il déclarer qquechose dans le fichier .xsl  
 
d'avance merci pour le renseignement ... sinon je fais une balise par paragraphe ...
 
mais ce serait mieux sans !
 
 

Reply

Marsh Posté le 08-11-2004 à 09:36:20    

Quand tu mets un &cr; dans ton XML, le xsl le retranscrit bien (normalement), mais ca n'a aucun effet sur un affichage web.
 
La bonne solution, pour moi, est d'utiliser des balises <br/> (fermées !) et, dans ta feuille XSL, d'afficher la valeur du noeud comme ceci :
 
<xsl:value-of select="//noeud" disable-output-escaping="yes" />
 
L'attribut 'disable-output-escaping' permet que ler processeur XSLT n'interprète pas les balises contenues dans le noeud comme des balises, mais simplement comme du texte.
 
J'espère que ceci pourra t'aider.


Message édité par mixoumix le 08-11-2004 à 09:50:47
Reply

Marsh Posté le 08-11-2004 à 09:38:20    

Dans mon cas, le texte à afficher contient des balises <br /> à la place des \n pour les retours à la ligne. Ensuite, je faisais un str_replace en php : je remplaçais les "<br />" par "<![CDATA[<br >]]>". Le résultat de cette opération était mise dans une balise xml et c'est ce qui était passé à mon xsl.
 
Donc, dans ton cas, faut faire un str_replace de "\n" par "<![CDATA[<br >]]>".
 
Par ailleurs, je précise que ma balise <description>mon texte</description> avait comme template dans mon xsl :  
<xsl:value-of select="description" disable-output-escaping="yes" />
 
Voilà...

Reply

Marsh Posté le 08-11-2004 à 09:42:41    

Sinon tu peux aussi utiliser des retours chariot texte dans ton XML (le retour chariot de notepad par exemple). Le retour chariot s'affichera bien si ta sortie est du texte simple. Si la sortie est du HTML, il faut remplacer tous les caractères '& # x A ;' (en enlevant les espaces, je ne peux pas l'écrire normalement, sinon ca ne s'affiche pas dans le forum) par '<br/>', ou plutot '&lt;br&gt;' pour éviter les ennuis d'affichage.
 
Tu mets dans ton code un template de ce style :
 

Code :
  1. <xsl:template name="texte_brut">
  2. <xsl:param name="text" />
  3. <xsl:choose>
  4. <xsl:when test="contains($text,'& # x A ;')">
  5.  <xsl:call-template name="texte_brut"><xsl:with-param name="text" select="concat(substring-before($text,'& # x A ;'), '&lt;br&gt;',substring-after($text,'& # x A ;'))" /></xsl:call-template>
  6. </xsl:when>
  7. <xsl:otherwise>
  8.  <xsl:value-of disable-output-escaping="yes" select="$text" />
  9. </xsl:otherwise>
  10. </xsl:choose>
  11. </xsl:template>


 
 
et tu l'utilises à l'endroit où tu veux afficher ton texte de cette facon :
 

Code :
  1. <xsl:call-template name="texte_brut"><xsl:with-param name="text" select="./element[@name='Texte']" /></xsl:call-template>


 
 
Voilà !


Message édité par mixoumix le 08-11-2004 à 09:47:10
Reply

Marsh Posté le 08-11-2004 à 11:09:32    

C'est vrai, j'avais pas précisé que ma sortie était du html...

Reply

Marsh Posté le 12-11-2004 à 22:26:00    


Merci à mixoumix et à rufo des indications mais malheureusement çà ne veut pas marcher dans mon cas.
 
ou je n'ai pas compris... il faut dire que je "m'auto-forme" en xml xslt ...  
 
le template : dès que je veux l'utiliser çà me plante mon fichier xsl
et par ailleurs je n'ai pas de programmation en php à utiliser dans mon cas : selon schema :  
 
<texte> paragraphe de texte ...&lt; ou br&gt; ou <br/> ou  \n ou <![CDATA[<br >]]> ... paragraphe de texte </texte>
 
j'ai beau essayer tout essayer,  
 
sinon je récupère bien mon texte  mais j'obtiens des <br> ou pas de signe du tout dans mon fichier html mais sans que l'effet de retour à la ligne soit visible à l'écran !
 
je crois que je vais être obligé de séparer mes textes xml un paragraphe entre chaque balise. c'est dommage car çà doit bien pouvoir marcher. surtout si çà marche chez vous ... :hello:  
 
Quelqu'un peut-il me dire si le XUL intègre ce type de traitement ?
 
je garde espoir ... :hello:  

Reply

Marsh Posté le 13-11-2004 à 11:12:35    

tu pourrais poster ta feuille de style xsl en un bout de ton xml? Ca nous aiderait à voir ce qui plante. Par ailelurs, tu utilises quel soft pour effectuer la transformtion xml-xslt? Moi, c'est sablotron...
 
Autre conseil, tu pourrais effecteur un test en php pour voir si la transfo marche mieux (utilises easyphp)...

Reply

Marsh Posté le 14-11-2004 à 20:19:19    


OK ! je vous poste un extrait schématique de mon programme :
 
1/ à sauver sous test.xml :
 
<!--<?xml-stylesheet type="text/xsl" ?>-->
<annonces>
<article>
<texte>Voila ! le texte (1ère ligne, 1er paragraphe.) que j'ai saisi dans ma fiche dans mon fichier d'articles XML.<br />
ici normalement je suis passé à la ligne 2 après mon retour <br />
ici normalement je suis passé à la ligne 3  après mon retour
ici normalement je suis passé à la ligne 4  après mon retour <![CDATA[<br >]]>
ici je termine mon 1er paragraphe.
</texte>
 
<texte1>Voila ! le texte (1ère ligne, 2ème paragraphe.)que j'ai saisi dans ma fiche dans mon fichier d'articles XML.<br />
ici normalement je suis passé à la ligne 2  après mon retour \n
ici normalement je suis passé à la ligne 3  après mon retour  \r
ici normalement je suis passé à la ligne 4  après mon retour &lt;  
et en fait  rien .... tout est à la queue leu leu ...
on voit seulement les traces des divers codes utilisés comme ordres de retour à la ligne.
(nb. le br écrit à l'ancienne  bloque le xsl.)
par contre les retours entre les paragraphes sont normalement compris.
 
</texte1>
</article>
</annonces>
 
2/ à sauver sous test.xsl :
 
<body>
<xsl:for-each select="annonces/article">
 
<xsl:value-of select="texte"/>
<br />
<br />
<xsl:value-of select="texte1"/>
 
 
</xsl:for-each>
 
</body>
</html>
 
</xsl:template>
</xsl:stylesheet>
 
 
3/ à sauver sous test.htm :
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
// Load XML  
var xml = new ActiveXObject("Microsoft.XMLDOM" )
xml.async = false
xml.load("test.xml" )
 
// Load the XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM" )
xsl.async = false
xsl.load("test.xsl" )
 
// Transform
document.write(xml.transformNode(xsl))
</script>
 
</head>
 
<body>
</xsl:if>
</xsl:for-each>
 
 
<xsl:template match="/">
</xsl:template>  
</xsl:stylesheet>
 
</body>
</html>
 
 
 
le tout dans le même répertoire:
 
le résultat : quand on lance text.htm çà vous donne la lecture de 2 paragraphes de texte.
 
 
Pour cette programmation je souhaite ne pas devoir passer par PHP, car le serveur n'en n'est  
 
pas équipé... et puis çà marche très bien sur mon site comme çà..., sauf ce foutu Pb de retours lignes à l'écran ...
 
Bien cordialement
 
NB à RUFO : j'utilise pour écrire le XML : HTML-Kit ou bien Dream-weaver en mode HTML
 

Reply

Marsh Posté le 14-11-2004 à 20:23:46    

NB erreur!!! : lire :
"le résultat : quand on lance test.htm cà vous donne ...."
 
mille excuses ....

Reply

Marsh Posté le 15-11-2004 à 07:02:31    

lino@ a écrit :

NB erreur!!! : lire :
"le résultat : quand on lance test.htm cà vous donne ...."
 
mille excuses ....


 
et ca par hasard?
 
<xsl:template match="br">
   <br/>
</xsl:template>
 
sinon je dirais que tu utilises mal le XML en specifiant explicitement  des balises retour a la ligne donc des balises de mises en pages direct.
tu ferais mieux d'y specifier des balises ayant une sémantique de paragraphes  
 


---------------
http://www.janaga.com
Reply

Marsh Posté le 15-11-2004 à 13:23:48    

Pourquoi pas !
et tu le mettrais où ce template ?...
Peux-tu expliciter ta réponse ...  
peut être en le positionnant exactement dans mon exemple test pour vérifier si çà marche ?
 
et que veux-tu dire par "sémantique de paragraphes" ?...
 

Reply

Marsh Posté le 15-11-2004 à 14:07:54    

Peux tu poster le code HTML généré ?

Reply

Marsh Posté le 15-11-2004 à 15:22:52    

lino@ a écrit :

Pourquoi pas !
et tu le mettrais où ce template ?...
Peux-tu expliciter ta réponse ...  
peut être en le positionnant exactement dans mon exemple test pour vérifier si çà marche ?
 
et que veux-tu dire par "sémantique de paragraphes" ?...


 
Tu es obligé de faire une regle XSL pour transformer la balise <BR/> de ton fichier XML en balise <BR/> HTML  car ton value-of ne recopie que les noeuds textes.  
Par contre tu peux utiliser  <xsl:copy-of select="."/> a la place de ton value-of qui va copier/coller l'integralité du noeud courant sur la sortie.
 
A mon sens tu aurais tout a gagner à specifier une balise paragraphe  
<para></para> dans ton XML et lors de ta transformation tu speficies une regle ajoutant ton saut de ligne a la fin d'un paragraphe.  
Cela joute une semantique superieur à ton article qu'un bete retour à la ligne.
 


---------------
http://www.janaga.com
Reply

Marsh Posté le 15-11-2004 à 20:56:22    

nithril a écrit :

Tu es obligé de faire une regle XSL pour transformer la balise <BR/> de ton fichier XML en balise <BR/> HTML  car ton value-of ne recopie que les noeuds textes.  
Par contre tu peux utiliser  <xsl:copy-of select="."/> a la place de ton value-of qui va copier/coller l'integralité du noeud courant sur la sortie.
 
A mon sens tu aurais tout a gagner à specifier une balise paragraphe  
<para></para> dans ton XML et lors de ta transformation tu speficies une regle ajoutant ton saut de ligne a la fin d'un paragraphe.  
Cela joute une semantique superieur à ton article qu'un bete retour à la ligne.


 
je suis d'accord avec le monsieur.
 
dans mon xml "pur", je mets un "\n" pour le saut de ligne. Par contre, pour mes besoins d'impression (sortir une version imprimable d'un document xml), je modifie un peu mon xml en effectuant un str_replace (fonction php) des "\n" par "<![CDATA[<br />]]>".

Reply

Marsh Posté le 16-11-2004 à 09:10:40    

Ben, pour moi, ca ca marche aussi, non ?
 
<xsl:value-of select="//noeud" disable-output-escaping="yes" />

Reply

Marsh Posté le 16-11-2004 à 10:25:59    


à mixoumix :
 
voila ce que çà donne avec le code que j'avais donné en exemple :
 
Voila ! le texte (1ère ligne, 1er paragraphe.) que j'ai saisi dans ma fiche dans mon fichier d'articles XML. ici normalement je suis passé à la ligne 2 après mon retour (LF) ici normalement je suis passé à la ligne 3 après mon retour ici normalement je suis passé à la ligne 4 après mon retour <br > ici je termine mon 1er paragraphe.  
 
Voila ! le texte (1ère ligne 2ème paragraphe.)que j'ai saisi dans ma fiche dans mon fichier d'articles XML. ici normalement je suis passé à la ligne 2 après mon retour \n ici normalement je suis passé à la ligne 3 après mon retour \r ici normalement je suis passé à la ligne 4 après mon retour < et en fait rien .... tout est à la queue leu leu ... on voit en fait les traces des divers codes utilisés comme ordres de retours à la ligne. (nb. le br écrit à l'ancienne bloque le xsl.) par contre les retours entre les paragraphes sont normalement compris.  
 
çà ne change rien si j'utilise :
<xsl:value-of select="texte ou texte1" disable-output-escaping="yes" />
 
à nithril :
quand j'utilise <xsl:copy-of select="."/> à la place de value-of çà plante mon test.xsl ! ...
 
quand tu dis " A mon sens tu aurais tout à gagner à specifier une balise paragraphe  
<para></para> dans ton XML" ... : c'est ce que je fais actuellement en séparant mes malises :  texte ... texte1 ...etc ...?  
puisque mes paragraphes texte texte1 ... je les intègre déjà ailleurs dans une table en mode écriture justifiée ...  
 
à rufo :
 
Je cherche pour l'instant une solution sans utiliser le PHP car sinon j'aurais tout intérêt à utiliser une base de données mySql + PHP or je cherche à n'utiliser qu'une base de données "purement XML" qui est destinée à intégrer des textes divers déjà écrits ailleurs ....
 
merci pour  vos recherches ... à partir de mon exemple test ...
 
 
 
 
 
 

Reply

Marsh Posté le 16-11-2004 à 12:12:59    

et avec les entity?
<!DOCTYPE stylesheet [  
<!ENTITY space "<xsl:text> </xsl:text>">  
<!ENTITY cr "<xsl:text>  
</xsl:text>">  
]>
 
t'avais essayé (cf un de mes posts plus haut)? à la place des "\n", tu mets &cr; si t'as défini "cr" dans entity...

Reply

Marsh Posté le 16-11-2004 à 12:48:00    

Code :
  1. <?xml version="1.0"?>
  2. <xsl:stylesheet version="1.0"
  3.      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  4. <xsl:template match="/">
  5. <xsl:for-each select="annonces/article">
  6. <xsl:copy-of select="."/>
  7. </xsl:for-each>
  8. </xsl:template>
  9. </xsl:stylesheet>


 
marche tres bien chez moi :p  
 

Citation :

c'est ce que je fais actuellement en séparant mes malises :  texte ... texte1 ...etc ...?  
puisque mes paragraphes texte texte1 ... je les intègre déjà ailleurs dans une table en mode écriture justifiée ...  


 
oui, mais pourquoi definir une balise texte, texte1,.., texten
une balise texte avec un attribut n'irait pas mieux?


Message édité par nithril le 16-11-2004 à 12:49:34

---------------
http://www.janaga.com
Reply

Marsh Posté le 17-11-2004 à 15:41:32    

bravo et merci à nithril pour la solution "<xsl:copy-of select..... au lieu de "<xsl:value-of select.... " détaillée ci-dessus :  
çà marche bien : j'ai pu le tester ce matin ; les balises <br /> xml sont bien reconnues (à condition ...)que que j'utilise dans mon fichier .xsl :
<xsl:stylesheet version="1.0"  
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 
au lieu de : <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
 
tu sais pourquoi? j'imagine que c'est une question de DTD ? il va falloir que j'étudie celà ...
 
en tout cas merci pour l'aide !
 
 
NB.  
à propos des balises texte, texte1, ... je voulais dire que je voulais séparer les textes  en paragraphes différents correspondants chacun à un champ de base de données XML de textes réutilisables ... mais ton idée de champs indexés (attribut ?) m'intéresse. il faut que je réfléchisse à çà !
 
à mixoumix et rufo :
 
merci pour les indications mais je n'ai pas pu  tester. dès que je peux, je vous  dis quoi ...
 
si vous, vous pouvez le vérifier directement à partir de mon exemple, tenez moi au courant.
 
bien cordialement !
 
à suivre ... :hello:  
 
 
 

Reply

Marsh Posté le 18-11-2004 à 11:11:05    

ben, à mon avis ton problème résidait surtout dans le namespace déclaré.
 
je pense que ma méthode marche également maintenant.
 
pour ce qui est de celle de rufo, je la trouve ... très originale, et ca vaudrait le coup de tester ca. J'essaierai des que j'aurai le temps.

Reply

Marsh Posté le 18-11-2004 à 12:07:54    

mixoumix a écrit :

ben, à mon avis ton problème résidait surtout dans le namespace déclaré.
 
je pense que ma méthode marche également maintenant.
 
pour ce qui est de celle de rufo, je la trouve ... très originale, et ca vaudrait le coup de tester ca. J'essaierai des que j'aurai le temps.


 
c'est clair que c'est pas forcément optimisé ou plus simple, mais ne maîtrisant pas toutes les "astuces" du xsl, c'est tout ce que j'ai trouvé, et c'est pas faute d'avoir essayé d'autres solutions...

Reply

Marsh Posté le 23-11-2004 à 10:58:10    

lino@ a écrit :

bravo et merci à nithril pour la solution "<xsl:copy-of select..... au lieu de "<xsl:value-of select.... " détaillée ci-dessus :  
çà marche bien : j'ai pu le tester ce matin ; les balises <br /> xml sont bien reconnues (à condition ...)que que j'utilise dans mon fichier .xsl :
<xsl:stylesheet version="1.0"  
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 
au lieu de : <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
 
tu sais pourquoi? j'imagine que c'est une question de DTD ? il va falloir que j'étudie celà ...


 
 :non: Rien à voir avec la DTD, la DTD contient la structure à laquelle doit correspondre ton xml, par contre en modifiant le namespace tu change carrément de version du processeur XSLT.


Message édité par avander le 23-11-2004 à 10:59:30
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed