xsl:result-文档抛出 "The system identifier of the principal output file is unknown" 错误

xsl:result-document throws "The system identifier of the principal output file is unknown" error

我正在尝试使用 xsl:result-document 将输出拆分为多个文件。但是我收到错误消息“主要输出文件的系统标识符未知”。

输入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" method="xml" omit-xml-declaration="yes">
    <xsl:copy-of select="*"/>
   </xsl:result-document>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

我们将 .Net 用于 运行 xslt 并进行以下转换

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;

      using (StringWriter stringWriter = new StringWriter())
      {
        Serializer serializer = xsltProcessor.NewSerializer();
        serializer.SetOutputWriter(stringWriter);
        xsltTransformer.Run(serializer);
        return stringWriter.ToString();
      }
    }
  }
}

我对此进行了一些研发并发现了类似的问题 但它并没有解决我的问题。我已经尝试在 2.0 和 3.0 版上使用 SAXON-HE 和 SAXON-EE (dll)。寻求快速响应。提前致谢。

您在 xsl:result-document@href 属性中给出了相对 URI。这被视为相对于转换的“主要输出 URI”。错误消息告诉您尚未提供主体输出 URI。这是因为您在未提供转换的情况下调用了转换。

您还没有告诉我们您是如何调用转换的。详细信息将取决于您是否使用了命令行、JAXP 转换 API、s9api 转换 API 或 fn:transform() 函数。这些 API 中的每一个都让您有机会提供所需的 URI。

也许问题的最常见原因(但现在我猜)是您使用了 JAXP 转换 API,并指定为转换的目标 a StreamResult 包含StreamWriter 但没有 systemId.

(我有点惊讶你应该 link 另一个问题,我在其中给出了完全相同的信息,并强调要详细回答它,我们需要看看你是如何调用转换的.很多人会把它当作重复的来关闭...)