这是我第一次尝试使用C#中的SaxonHE 9.9编写Xslt2.0转换,所以这里的问题是当我创建serilizer时,我得到的错误是class Saxon.Api.Serializer
不包含带0参数的约束器。
我知道这个错误意味着什么,但不知道它为什么会发生,因为我看到的每个例子都创建了这样的序列化器。这个问题听起来有点愚蠢,但我找不到答案让它工作。
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");
}
}
}
编辑
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();
}
}
}
我也改变了其他一些想法,现在它起作用了,谢谢你的答案。
我将记录一个错误,即存在使用“new Serializer()”表单的示例应用程序和/或文档。
我们在9.8中从Java产品中删除了它,因为它导致了一直存在的问题,即Serializer不必(必须)访问所有配置选项(保存在处理器中);也使用工厂方法Processor.newSerializer()
可能允许我们创建Serializer
的子类,因此它更灵活。然后我们在9.9版本的.NET上遵循这种模式,部分原因相同,部分原因是.NET API现在已被重写为Java API之上的一个非常薄的层,这有助于我们保持通用性,并且简化测试。
我们努力维护主要产品API的向后兼容性,但并不要求覆盖所有其他API;如果我们觉得我们遇到了严重的问题,那么我们就会解决它。正如有些人所说的那样为政策辩护,“未来比过去更长”。
后来
我们已经做了一些检查,我们认为9.9文档和示例应用程序是正确的;你必须使用旧版本。如果我错了,请找出您发现错误信息的具体位置。
在9.9中你可以(或者真的需要)用Serializer
的各种重载创建一个processor.NewSerializer
(参见http://saxonica.com/html/documentation/dotnetdoc/Saxon/Api/Processor.html#NewSerializer(Stream))。