insertion de saut de ligne ? [xml+xsl] - XML/XSL - Programmation
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).
Marsh Posté le 03-08-2004 à 13:07:45
up
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
Marsh Posté le 11-10-2004 à 11:56:55
La balise <br/> est-elle correctement protégée ?
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...
Marsh Posté le 11-10-2004 à 16:01:58
j'ai essayé en mettant <br />> mais c'est pas ça pour protéger...
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
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.
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...
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
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 :
|
The result has the carriage return and space right where the entity references put them.
Code :
|
Je pense que ça devrait résoudre mon pb ))
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 :
|
ça marche uniquement si je mets les &cr; dans la feuille xsl...
La solution est la suivante.
Code :
|
c'est un peut lourd, mais ça marche
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 ...
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 !
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.
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à...
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 '<br>' pour éviter les ennuis d'affichage.
Tu mets dans ton code un template de ce style :
Code :
|
et tu l'utilises à l'endroit où tu veux afficher ton texte de cette facon :
Code :
|
Voilà !
Marsh Posté le 08-11-2004 à 11:09:32
C'est vrai, j'avais pas précisé que ma sortie était du html...
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 ...< ou br> 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 ...
Quelqu'un peut-il me dire si le XUL intègre ce type de traitement ?
je garde espoir ...
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)...
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 <
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
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 ....
Marsh Posté le 15-11-2004 à 07:02:31
lino@ a écrit : NB erreur!!! : lire : |
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
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" ?...
Marsh Posté le 15-11-2004 à 15:22:52
lino@ a écrit : Pourquoi pas ! |
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.
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. |
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 />]]>".
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" />
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 ...
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...
Marsh Posté le 16-11-2004 à 12:48:00
Code :
|
marche tres bien chez moi
Citation : c'est ce que je fais actuellement en séparant mes malises : texte ... texte1 ...etc ...? |
oui, mais pourquoi definir une balise texte, texte1,.., texten
une balise texte avec un attribut n'irait pas mieux?
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 ...
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.
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é. |
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...
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 : |
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.
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.