C# 如何使用Saxon api进行转换
我使用的是萨克森9.8。我想用C#编写一个转换函数,如下所示C# 如何使用Saxon api进行转换,c#,xml,xslt-2.0,saxon,C#,Xml,Xslt 2.0,Saxon,我使用的是萨克森9.8。我想用C#编写一个转换函数,如下所示 `using Saxon.Api; private string Transform(Stream xmlStream, string transform) { }` 请帮我填写此函数我认为您至少应该尝试自己编写代码,当您陷入困境时,请在internet上查找可能的答案。只有当你不能用这种方式解决我们的问题时,你才会问一个具体的问题。我不会为你写你的全部代码。但我可以在这里分享如何使用Saxon API进行X
`using Saxon.Api;
private string Transform(Stream xmlStream, string transform)
{
}`
请帮我填写此函数我认为您至少应该尝试自己编写代码,当您陷入困境时,请在internet上查找可能的答案。只有当你不能用这种方式解决我们的问题时,你才会问一个具体的问题。我不会为你写你的全部代码。但我可以在这里分享如何使用Saxon API进行XSLT转换:
public static String TransfromXMLWithXSLT2(String i_xmlData, String i_xsltCode)
{
Processor xsltProcessor = new Processor();
DocumentBuilder documentBuilder = xsltProcessor.NewDocumentBuilder();
documentBuilder.BaseUri = new Uri("file://");
XdmNode xdmNode = documentBuilder.Build(new StringReader(i_xmlData));
XsltCompiler xsltCompiler = xsltProcessor.NewXsltCompiler();
XsltExecutable xsltExecutable = xsltCompiler.Compile(new StringReader(i_xsltCode));
XsltTransformer xsltTransformer = xsltExecutable.Load();
xsltTransformer.InitialContextNode = xdmNode;
using (StringWriter stringWriter = new StringWriter()) {
Serializer serializer = new Serializer();
serializer.SetOutputWriter(stringWriter);
xsltTransformer.Run(serializer);
return stringWriter.ToString();
}
}
我在转换类中使用了一个开关来支持XSLT1.0。对于XSLT1.0,我更喜欢.Net功能,只是为了了解您的信息,我的代码如下所示:
public static String TransfromXMLWithXSLT1(String i_xmlData, String i_xsltCode)
{
XslCompiledTransform xslt = new XslCompiledTransform();
using (StringReader xsltStringReader = new StringReader(i_xsltCode)) {
using (XmlReader xsltXmlReader = XmlReader.Create(xsltStringReader)) {
xslt.Load(xsltXmlReader);
using (StringReader tableStringReader = new StringReader(i_xmlData)) {
using (XmlReader tableXmlReader = XmlReader.Create(tableStringReader)) {
using (StringWriter stringWriter = new StringWriter()) {
xslt.Transform(tableXmlReader, new XsltArgumentList(), stringWriter);
return stringWriter.ToString();
}
}
}
}
}
}
因此,如果您需要流/读取器而不是字符串,只需按需要的方式更改代码即可 这个函数到底应该做什么?如果要使用字符串
transform
中的XSLT转换输入xmlStream
,为什么结果会是XmlReader
?XmlReader可以作为转换的输入。请确保下载saxon资源文件,并查看使用此API的示例应用程序。@Martin Honen,返回XmlReader是我的应用程序需要的东西。没关系。返回一个字符串可以工作,但我需要在手动转换器中设置baseUri.SetInputStream(Stream input,Uri baseUri);我不知道这是干什么用的。我应该设置什么Uri?请参阅文档,它解释了“baseUri:主体输入文档的基本Uri。例如,如果文档包含以相对Uri形式指向其他文档的链接,则document()函数将使用该Uri”What is documentBuilder.baseUri=新Uri(“file:///C:/"); 对于它是强制性的吗?如果我不需要呢?好问题!这是强制性的,但我不知道为什么。我想这是因为萨克森特别适合处理文件。通常,DocumentBuilder会在系统上创建新文档。我只是用它为XsltTransformer创建一个XdmNode。但它似乎足以纠正新的Uri(“文件:/”)。在其他blog to=>中看到了这一点,在从nuget添加(使用:安装软件包Saxon HE-Version 9.8.0.15)后,函数帮助了我