Bonjour,
je cherche a crée un fichier .doc à partir d'un fichier xsl d'un fichier xml. Seulement je ne trouve pas le caractere special à inserer dan sle fichier xsl pour generer un retour à la ligne dans word.
Merci d'avance de votre aide.
Version imprimable
Bonjour,
je cherche a crée un fichier .doc à partir d'un fichier xsl d'un fichier xml. Seulement je ne trouve pas le caractere special à inserer dan sle fichier xsl pour generer un retour à la ligne dans word.
Merci d'avance de votre aide.
pour plus de precisions,
je dispose d'un fichier xml que je veut inclure dans un fichier .doc grace à la fonction xslt.Transform(string, string) (en c#).
Mon probléme est que les caracteres de retour à la ligne compris par le xml ne sont pas les mêmes que ceux compris par le format .doc (en xml j'ai mis \r\n)
Donc ma question est la suivante : Par quel caractere doit-je replacer le \r\n pour obtenir un retour à la ligne dans word.
Merci de me repondre, leprojet est urgent et je commence à étre dans le rouge bien comme il faut.
Est-ce que la balise <w:br /> ne conviendrait pas?
Je vais essayer, merci
Malheureusement ça ne marche pas. Comme toutes les autres solutions que j'ai essayé, il m'écrit <w:br /> dans word. Merci quand même de t'étre interessé à mon problème.
Est-ce que tu pourrais fournir ton code pour qu'on puisse voir de plus près ce qu'il se passe?
Merci
coté c# je génére la ligne grace à cette méthode
Territory etant la balise dans laquelle j'insert le texte et ligneTerritory est la string que j'insert dans la balise et qui contient mes retour à la ligne (je peut facilement inserer n'importe quel caractére dans cette string)Code:
1
2 xmlWriter.AddNode("Territory",ligneTerritory);
Ensuite un efois que j'ai généré le fichier xml je le transforme en format .doc grace à :
voila demande moi si tu veut que j'explique plus le code ou si tu veut que j'en rajoute...Code:
1
2
3
4
5
6
7 XslTransform xslt = new XslTransform(); xslt.Load(folderTemplates + "VADCONTRACTV3.xsl"); string nomContrat = monContrat.PartnerAddress.CompanyName.Replace ("/","-") + "_" +numeroLigne.ToString () +".doc"; xslt.Transform(folderContract + NameOfXmlDataNormalised,folderContract +nomContrat);
Il faut que ton document généré ressemble à ça:
Est-ce que ta structure correspond?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <?xml version="1.0" encoding="utf-8" ?> <w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"> <w:body> <w:p> <w:r> <w:t>J'écris sur une ligne</w:t> <w:br /> <!--Retour à la ligne--> <w:t>Et là je suis en dessous!</w:t> <w:br /> <!--un autre retour à la ligne--> </w:r> </w:p> </w:body> </w:wordDocument>
j'avais effectivement vu quelque cheose comme ça, mais le probleme c'est que je ne génére pas directement le fichier .doc à partir du fichier xml. En fait j'utilise un template xsl que je mouline avec le fichier xml afin d'obtenir le document word. donc mon fichier xml n'a pas cette structure. Mais je peut peut-étre integrer juste une partie de ce qu tu me propose dans une de mes balise.
voila quelque chose comme ça...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <Ligne> <AuthorizationName>MSD M - Manufacturing</AuthorizationName> <DistributorStatus>VAD</DistributorStatus> <Territory> <!--je doit mettre mon texte avec les retour à la ligne dans cette balise--> <w:body> <w:p> <w:r> <w:t>J'écris sur une ligne</w:t> <w:br /> <!--Retour à la ligne--> <w:t>Et là je suis en dessous!</w:t> <w:br /> <!--un autre retour à la ligne--> </w:r> </w:p> </w:body> </Territory> </Ligne>
dit moi ce que tu en pense, je vais essayer.
D'après ce que j'ai compris (corrige moi si je me trompe):
- tu as tes données dans un fichier xml
- tu transformes ce document en un document word via un template xsl
Si c'est bien ça, pourquoi ne fais tu pas ceci dans le xsl:
Cela te générera un document word avec les retour à la ligne où tu le souhaites. (c'est à dire là où tu as décidé de les placer dans ton document XML)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <xsl:template match="/"> <w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"> <w:body> <w:p> <w:r> <w:t><xsl:copy-of select="Territory" /></w:t> <!--Tu as mis les balises <w:br/> dans le fichier XML--> <w:br/> <!--Retour à la ligne--> <w:t>Texte en dessous de Territory</w:t> <w:br/> <!--un autre retour à la ligne--> </w:r> </w:p> </w:body> </w:wordDocument > </xsl:template>
C'est tout à fait ça.
Ta solution devrai marcher, en fait j'aurai voulu trouver une autre solution car celle la va me demander pas mal de modif (j'ai un certain nombre de template) mais visiblement y a pas d'autre solution.
Je te remercie pour ton aide et pour le temps que tu m'a consacré.
Pour forcer des renvois à la ligne, je vois 2 solutions:
- soit tu écris "en dur" les balises dans le fichiers xml
Code:<Territory>J'écris une ligne<w:br/>Mais ceci est en dessous</Territory>
- soit tu coupes ton texte en différentes parties
Et dans le xsl, tu insères la balise <w:br/> à chaque tour dans <xsl:for-each>Code:
1
2
3
4 <Territory> <ligne>J'écris une ligne</ligne> <ligne>Mais ceci est en dessous</ligne> </Territory>
La premiere solution n'est pas possible au vue de la methode que j'utilise pour faire la conversion de la string en xml ( xmlWriter.CloseNode() ) converti automatique le caractéres speciaux tel que < et > en ≶ &mg; donc ça ne marche pas.
Quand à la deuxieme solution c'est celle que je vais utiliser. Le probléme c'est qu'elle m'oblige à modifier les templates et les fichiers xsd, que j'avais recuperé tout fait, et qu'il y en a un certain nombre.
Mais au final je pense que c'est la seul solution. Donc ont avaient eu la même idée.
encore merci pour ton aide :king: