C'est ma première tentative de programmer une transformation Xslt2.0 avec SaxonHE 9.9 en C #, donc le problème ici est que lorsque je crée le sérilisateur, j'obtiens l'erreur que la classe Saxon.Api.Serializer
ne contient aucun constructeur avec 0 argument.
Je sais ce que signifie cette erreur, mais pas pourquoi elle se produit, car chaque exemple que je vois crée le sérialiseur comme celui-ci. Cette question semble un peu stupide, mais je ne trouve pas de réponse pour la faire fonctionner. p >
using System; using Saxon.Api; using System.IO; using System.Reflection; namespace XY { class Program { static void Main(string[] args) { string currentDirectory = Directory.GetCurrentDirectory(); String SourceFilename = ".\\test\\test.xml"; String StylesheetFilename = ".\\scripte\\xml-to-html.xsl"; String OutputFilename = ".\\Output\\result.html"; if (StylesheetFilename.StartsWith(".\\")) { StylesheetFilename = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + StylesheetFilename; } if (SourceFilename.StartsWith(".\\")) { SourceFilename = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + SourceFilename; } var uri_source = new System.Uri(SourceFilename); var uri_xsl = new System.Uri(StylesheetFilename); Processor processor = new Processor(); XdmNode input = processor.NewDocumentBuilder().Build(uri_source); processor.SetProperty("http://saxon.sf.net/feature/preferJaxpParser", "true"); XsltCompiler compiler = processor.NewXsltCompiler(); XsltExecutable executable = compiler.Compile(uri_xsl); XsltTransformer transformer = executable.Load(); transformer.InitialContextNode = input; Serializer serializer = processor.NewSerializer(); System.IO.StreamWriter stream = new StreamWriter(OutputFilename); serializer.SetOutputWriter(stream); transformer.Run(serializer); stream.Close(); } } }
MODIFIER
using Saxon.Api; namespace XY { class Program { static void Main(string[] args) { String SourceFilename = "./test/test.xml"; String StylesheetFilename = "./scripte/xml-to-html.xsl"; String OutputFilename = "./Output/test.html"; using (FileStream streamXml = File.OpenRead(SourceFilename)) { using (FileStream streamXsl = File.OpenRead(StylesheetFilename)) { Processor processor = new Processor(); DocumentBuilder builder = processor.NewDocumentBuilder(); Uri uri = new Uri("urn:test"); builder.BaseUri = uri; XdmNode input = builder.Build(streamXml); XsltTransformer transformer = processor.NewXsltCompiler().Compile(streamXsl).Load(); transformer.InitialContextNode = input; Serializer serializer = new Serializer(); serializer.SetOutputFile(OutputFilename); transformer.Run(serializer); } } Console.WriteLine("test.html created successfully"); } } }
Je change aussi d'autres réflexions et maintenant ça marche, merci pour les réponses .
3 Réponses :
En 9.9, vous pouvez (ou vraiment besoin de) créer un Serializer
avec les différentes surcharges de processor.NewSerializer
(voir http://saxonica.com/html/documentation/dotnetdoc/Saxon/Api/Processor.html #NewSerializer (Stream) ) ..
Je vais enregistrer un bogue sur le fait qu'il existe des exemples d'applications et / ou de documentation qui utilisent le formulaire "new Serializer ()".
Nous avons supprimé cela du produit Java dans la version 9.8 car cela causait des problèmes constants: le sérialiseur n'a pas (nécessairement) accès à toutes les options de configuration (contenues dans le processeur); aussi utiliser une méthode d'usine Processor.newSerializer ()
nous permet potentiellement de créer une sous-classe de Serializer
, donc c'est plus flexible. Nous avons ensuite suivi ce modèle sur .NET dans la version 9.9, en partie pour les mêmes raisons, et en partie parce que l'API .NET a maintenant été réécrite sous la forme d'une couche très fine au-dessus de l'API Java, ce qui nous aide à maintenir la communauté simplifie les tests.
Nous nous efforçons de maintenir la compatibilité ascendante dans les principales API du produit, mais ce n'est pas une exigence qui remplace toutes les autres; si nous sentons que quelque chose ne va pas, nous le réparons. Comme certains le disent pour justifier la politique, "l'avenir est plus long que le passé".
< gagnantLATER
Nous avons fait quelques vérifications et nous pensons que la documentation 9.9 et les exemples d'applications sont corrects; vous devez utiliser une version plus ancienne. Si je me trompe, veuillez identifier l'emplacement précis où vous avez trouvé des informations incorrectes.
Dans notre application, nous avons utilisé la version 9.6.0.7 de Saxon 9he-api plus tôt et il y avait public Serializer (); de la même manière, mais lorsque nous avons mis à jour aujourd'hui vers la dernière version 9.9.1.5 de Saxon 9he-api, le constructeur a été supprimé et il rompt notre compilation de code maintenant. Il aurait dû être conservé pour prendre en charge la rétrocompatibilité ou fournir une alternative s'il vous plaît.
L'alternative, comme indiqué ci-dessus, est de construire le sérialiseur en utilisant la méthode Processor.newSerializer ()
. Désolé que vous ayez été gêné par ce changement; Je pense avoir expliqué les raisons pour lesquelles cela a été fait dans ma réponse.
Voici ma solution au problème:
using System; using System.IO; using Saxon.Api; namespace Project1 { public static class ClassMain { public static string TransformXml(string xmlData, string xslData) { var xsltProcessor = new Processor(); var documentBuilder = xsltProcessor.NewDocumentBuilder(); documentBuilder.BaseUri = new Uri("file://"); var xdmNode = documentBuilder.Build(new StringReader(xmlData)); var xsltCompiler = xsltProcessor.NewXsltCompiler(); var xsltExecutable = xsltCompiler.Compile(new StringReader(xslData)); var xsltTransformer = xsltExecutable.Load(); xsltTransformer.InitialContextNode = xdmNode; var results = new XdmDestination(); xsltTransformer.Run(results); return results.XdmNode.OuterXml; } public static void Main() { var xmlData = File.ReadAllText("a.xml"); var xslData = File.ReadAllText("a.xsl"); var data = TransformXml(xmlData, xslData); Console.WriteLine(data); Console.ReadKey(); } } }