Utiliser XSLT en C# (avec XML)

Bonjour,

Ci dessous le processus pour utiliser le combo xslt xml en C#

1. Créer la classe de l’objet que vous voulez serialiser en XML.

Exemple :

[XmlRoot(ElementName = "CSuiviDetail")]
 
public class CBordereauDetail
 
{
 
[XmlElement("Array1_elems")]
 
public Array1_elem[] Array1_elems;
 
public CBordereauDetail(int Array1_elemsNumber)
 
{
 
Array1_elems = new Array1_elem[Array1_elemsNumber];
 
}
 
public CBordereauDetail()
 
{
 
}
 
}
 
[XmlRoot(ElementName = "Array1_elem")]
 
public class Array1_elem
 
{
 
[XmlAttribute("semaine")]
 
public int semaine;
 
[XmlAttribute("codeIngenieur")]
 
public string codeIngenieur;
 
[XmlElement("fonctionnalite")]
 
public string fonctionnalite;
 
[XmlAttribute("charge")]
 
public double charge;
 
[XmlElement("detail")]
 
public string detail;
 
}

2.  Créer le fichier XML:

using System.Xml;
 
using System.Xml.Serialization;
 
using System.IO;
 
//Création et initialisation de l'élément "BordereauDetail"
 
//..
TextWriter writer = new StreamWriter(xmlFilename);
XmlSerializer serializer = new XmlSerializer(typeof(CBordereauDetail));
serializer.Serialize(writer, BordereauDetail);
writer.Close();

3. Executer la règle XSLT et sauver le fichier

Attention au format, en effet si vous générez le fichier avec un StreamWriter, il se peut qu’il se produise un conflit qui pose problème (fichier généré avec l’entête utf-16 mais toujours sous la forme utf-8)

Préférez le code suivant si vous rencontrez des problèmes:

Byte[] buffer = XMLXSLfunct.ApplyXSLRule(xmlFilename, xslFilename);
 
using (System.IO.Stream s = System.IO.File.Create(outputFilename))                {
 
s.Write(buffer, 0, buffer.Length);
 
}
 
//fichier XMLXSLfunct:
 
using System.IO;
 
using System.Xml;
 
using System.Xml.Linq;
 
using System.Xml.Xsl;
 
using System.Xml.XPath;
 
using Mvp.Xml.Common.Xsl;
 
public static byte[] ApplyXSLRule(string reportXmlFilename, string xslFilename)
 
{
 
 /* ----------------- TRANSFORMATION XSL ---------------- */
 
XslCompiledTransform xslt = new XslCompiledTransform();
 
try
 
{
 
xslt.Load(xslFilename);
 
}
 
catch (Exception ex)
 
{
 
int error = 0;
 
}
 
System.Xml.XPath.XPathDocument fluxXml = new System.Xml.XPath.XPathDocument (reportXmlFilename);
 
MemoryStream ms = new MemoryStream();
 
xslt.Transform(fluxXml, null, ms);
 
Byte[] buffer = new Byte[ms.Length];
 
buffer = ms.ToArray();
 
ms.Close();
 
return buffer;
 
}

Voilà, vous avez votre fichier de sortie outputFilename, généré à partir de votre classe en C#, et parsé par un XSLT de votre choix.

De XML à Word (WordML) via XSLT

Bonjour,

Aujourd’hui, petit post sur l’utilisation de XSLT pour créer un document Word à l’aide d’un fichier XML

Procédure:

1. Créez ou ouvrez sous word le fichier type, celui que vous voudriez générer. Puis sauvegardez le au format .xml (2003)

2. Ouvrez le avec un éditeur de text (comme notepad++ par exemple)

Constatez qu’il est assez long (et brouillon!)

Il consiste en ces 3 lignes :

<?xml version=1.0″ encoding=”UTF-8″ standalone=”yes”?>
 
<?mso-application progid=”Word.Document?>

Suivi d’une balise:

<w:wordDocument xmlns:aml=”ht….> (ici se trouve toutes les données du document) </w:wordDocument>

3. Modifiez la structure pour avoir au final:

<?xml version=1.0″ encoding=”Windows-1252?>
 
<xsl:stylesheet version=2.0″
 
xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”
 
xmlns:msxsl=”urn:schemas-microsoft-com:xslt”
 
extension-element-prefixes=”msxsl”
 
xmlns:aml=”http://schemas.microsoft.com/aml/2001/core”
 
xmlns:dt=”uuid:C2F41010-65B3-11d1-A29F-00AA00C14882″
 
xmlns:ve=”http://schemas.openxmlformats.org/markup-compatibility/2006″
 
xmlns:o=”urn:schemas-microsoft-com:office:office”
 
xmlns:v=”urn:schemas-microsoft-com:vml”
 
xmlns:w10=”urn:schemas-microsoft-com:office:word”
 
xmlns:w=”http://schemas.microsoft.com/office/word/2003/wordml”
 
xmlns:wx=”http://schemas.microsoft.com/office/word/2003/auxHint”
 
xmlns:wsp=”http://schemas.microsoft.com/office/word/2003/wordml/sp2″
 
xmlns:sl=”http://schemas.microsoft.com/schemaLibrary/2003/core”
 
w:macrosPresent=”no” w:embeddedObjPresent=”no” w:ocxPresent=”no” xml:space=”preserve”>
 
<xsl:output method=”xml” indent=”no” version=1.0″
 
encoding=”Windows-1252″ standalone=”yes”/>
 
<w:ignoreSubtree w:val=”http://schemas.microsoft.com/office/word/2003/wordml/sp2″/>
 
<xsl:template match=/>
 
<xsl:processing-instruction name=”mso-application”>
 
<xsl:text>progid=”Word.Document</xsl:text>
 
</xsl:processing-instruction>
 
<w:wordDocument>
 
<o:DocumentProperties>
 
<!– gardez tout ce qui se trouve à l’interieur de Document Properties, de meme pour les blocs suivants:>
 
</o:DocumentProperties>
 
<w:fonts>
 
</w:fonts>
 
<w:styles>
 
</w:styles>
 
<w:divs>
 
</w:divs>
 
<w:shapeDefaults>
 
</w:shapeDefaults>
 
<w:docPr>
 
</w:docPr>
 
<w:body> <!– ici se trouve le “vrai contenu”
 
</w:body>
 
</w:wordDocument>
 
</xsl:template>
 
</xsl:stylesheet>

Renommez en .xslt

Voila, vous avez désormais une feuille xslt qui doit vous donner l’exacte réplique de votre page word. Elle n’a rien de dynamique pour le moment mais vous avez la base! Le reste n’est qu’utilisation normale du « langage » xsl!

Pour ajouter un saut de page, la commande est :

<w:br w:type=”page”/>

Bonne chance

Projet Personel Encadré, ENIB : Cinématique inverse

Pour introduire ce post, je vais citer wikipedia (Oui, c’est le mal je sais, mais au moins je ne perdrais personne des la premiere ligne :))

« La cinématique inverse (souvent abrégée IK, de l’anglais inverse kinematics) est un procédé par lequel on peut déterminer les positions et rotations d’articulations d’un modèle afin d’obtenir une pose.

Le terme « cinématique inverse » renvoie au fait que l’étude cinématique se fait généralement à partir des paramètres des articulations, afin de déterminer l’évolution de la pose. »

http://fr.wikipedia.org/wiki/Cinématique_inverse

Durant ce projet, l’un des buts était l’implémentation d’une fonction permettant de calculer la pseudo inverse d’une matrice non carrée. Apres quelques recherches, les algorithmes SVD (pour Singular Value Decomposition) et Greville sont apparus etre les plus a meme de remplir ce role. Je ne vais pour le moment pas rentrer trop en detail dans le reste du projet, mais je voulais surtout que ces deux algorithmes soient disponibles (j’avais pas mal cherché du code a ce moment la, sans réussite) Les 2 fonctions sont implémentées en C++ avec l’aide de la library GSL Library.

Dans l’archive, vous trouverez l’implementation des algorithmes Greville et SVD, ainsi qu’un simple code de test permettant de tester leurs performances respectives. Pour aller plus vite, voici un graph a propos de la vitesse d’execution des 2 algorithmes.

pour 500.000 itérations

> Télécharger l’archive <

Seconde partie: