J'aimerais partager ce petit morceau de code qui lit une base de données et la transforme à l'aide de XSLT. En haut, j'ai également utilisé xslt-extensions
ce qui le rend un peu différent des autres.
Remarque : Il s'agit d'un projet de code qui peut nécessiter un nettoyage avant d'être utilisé en production.
var schema = XDocument.Load(XsltPath);
using (var connection = new SqlConnection(ConnectionString))
{
connection.Open();
using (var command = new SqlCommand(Sql, connection))
{
var reader = command.ExecuteReader();
var dt = new DataTable(SourceNode);
dt.Load(reader);
string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + Environment.NewLine;
using (var stringWriter = new StringWriter())
{
dt.WriteXml(stringWriter, true);
xml += stringWriter.GetStringBuilder().ToString();
}
XDocument transformedXml = new XDocument();
var xsltArgumentList = new XsltArgumentList();
xsltArgumentList.AddExtensionObject("urn:xslt-extensions", new XsltExtensions());
using (XmlWriter writer = transformedXml.CreateWriter())
{
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(schema.CreateReader());
xslt.Transform(XmlReader.Create(new StringReader(xml)), xsltArgumentList, writer);
}
var result = transformedXml.ToString();
}
}
XsltPath
est le chemin d'accès à votre fichier xslt.
ConnectionString
pointe vers votre base de données.
Sql
est votre question.
SourceNode
est le nœud de chaque enregistrement dans la source xml.
Maintenant, la partie intéressante, veuillez noter l'utilisation de urn:xslt-extensions
y new XsltExtensions()
dans le code ci-dessus. Vous pouvez l'utiliser si vous avez besoin d'un calcul complexe qui n'est pas possible en xslt. Voici une méthode simple pour formater une date.
public class XsltExtensions
{
public string FormatDate(string dateString, string format)
{
DateTime date;
if (DateTime.TryParse(dateString, out date))
return date.ToString(format);
return dateString;
}
}
Dans un fichier XSLT, vous pouvez l'utiliser comme suit ;
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="urn:xslt-extensions">
...
<myTag><xsl:value-of select="ext:FormatDate(record_date, 'yyyy-MM-dd')"/></myTag>
...
</xsl:stylesheet>
11 votes
En fait, je pense que c'est une excellente question, et vous y avez apporté une bonne réponse. Candidature pour la réouverture.
0 votes
J'ai trouvé Xslt déroutant, ce qui m'a aidé. github.com/beto-rodriguez/SuperXml