如何通过 c# xsltTransformer 在 Azure、FTP 和 SFTP 中使用 xsl:result-document 保存拆分文件?
Posted
技术标签:
【中文标题】如何通过 c# xsltTransformer 在 Azure、FTP 和 SFTP 中使用 xsl:result-document 保存拆分文件?【英文标题】:How to save split file using xsl:result-document in Azure, FTP and SFTP through c# xsltTransformer? 【发布时间】:2022-01-06 03:48:03 【问题描述】:我正在尝试使用 xsl:result-document 将输出拆分为多个文件。但不知道如何将拆分结果存储在 Azure、FTP 和 SFTP 服务器中。
输入 XML:
<ArrayOfBatch>
<Batch>
<BatchName>BatchName-1</BatchName>
</Batch>
<Batch>
<BatchName>BatchName-2</BatchName>
</Batch>
<Batch>
<BatchName>BatchName-3</BatchName>
</Batch>
</ArrayOfBatch>
XSLT 格式:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" version="3.0" exclude-result-prefixes="fn xs">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="/ArrayOfBatch/Batch">
<xsl:result-document href="Batch-position().xml" >
<xsl:copy-of select="*"/>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
c#代码:
public static string SaxonProcessorXSLT(string xmlToExport, string xslStylesheet)
using (StringReader xmlStream = new StringReader(xmlToExport))
using (StringReader xslStream = new StringReader(xslStylesheet))
Processor xsltProcessor = new Processor();
DocumentBuilder documentBuilder = xsltProcessor.NewDocumentBuilder();
documentBuilder.BaseUri = new Uri("file://");
XdmNode xdmNode = documentBuilder.Build(xmlStream);
XsltCompiler xsltCompiler = xsltProcessor.NewXsltCompiler();
XsltExecutable xsltExecutable = xsltCompiler.Compile(xslStream);
XsltTransformer xsltTransformer = xsltExecutable.Load();
xsltTransformer.InitialContextNode = xdmNode;
xsltTransformer.BaseOutputUri = new Uri("D://home//data//");
using (StringWriter stringWriter = new StringWriter())
Serializer serializer = xsltProcessor.NewSerializer();
serializer.SetOutputWriter(stringWriter);
xsltTransformer.Run(serializer);
return stringWriter.ToString();
从上面的代码中,拆分文件的结果存储在本地路径“D://home//data8//”中,但我正在寻找一种解决方案,通过使用 URI 将此结果存储在 azure、FTP 和 SFTP 服务器中在 xsltTransformer.BaseOutputUri 上。
我已经对此进行了一些研发,但它并没有解决我的问题。寻求快速响应。提前致谢。
【问题讨论】:
你在 Azure 中运行 C# 代码吗? 我不希望库支持 SFTP URL。您必须自己处理上传问题。stringWriter.ToString()
是否返回您要上传的内容?
【参考方案1】:
对于结果文档,您可以在 XsltTransformer
(https://www.saxonica.com/html/documentation10/dotnetdoc/Saxon/Api/XsltTransformer.html#ResultDocumentHandler) 上设置 ResultDocumentHandler
,然后可以通过 .NET (S)FTP 客户端为您提供的 Stream 或 Writer 创建 Serializer
。
【讨论】:
【参考方案2】:假设您可以使用Serializer.SetOutputStream
提供表示远程文件的流:
serializer.SetOutputStream(remoteFileStream);
使用您最喜欢的 FTP/SFTP 库来创建输出流。
对于 SFTP,您可以使用 SSH.NETSftpClient.Open
。
对于 FTP,您可以使用FtpWebRequest.GetRequestStream
。一些例子:Upload a file to an FTP server from a string or streamUpload a streamable in-memory document (.docx) to FTP with C#?
【讨论】:
以上是关于如何通过 c# xsltTransformer 在 Azure、FTP 和 SFTP 中使用 xsl:result-document 保存拆分文件?的主要内容,如果未能解决你的问题,请参考以下文章