如何通过 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.NET SftpClient.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 保存拆分文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSLT 转换在 XML 中创建 xmlns 属性

如何通过 C# 应用程序在文件级别授予 Windows 权限?

如何通过C#代码在KML中写引号

如何通过C#代码导出数据库并在本地导入?

如何通过 C# 从 IIS 获取网站名称的端口?

如何通过oracle在c#中使用多个选择查询