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
包含Stream
或 Writer
但没有 systemId
.
(我有点惊讶你应该 link 另一个问题,我在其中给出了完全相同的信息,并强调要详细回答它,我们需要看看你是如何调用转换的.很多人会把它当作重复的来关闭...)
我正在尝试使用 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();
}
}
}
}
我对此进行了一些研发并发现了类似的问题
您在 xsl:result-document
的 @href
属性中给出了相对 URI。这被视为相对于转换的“主要输出 URI”。错误消息告诉您尚未提供主体输出 URI。这是因为您在未提供转换的情况下调用了转换。
您还没有告诉我们您是如何调用转换的。详细信息将取决于您是否使用了命令行、JAXP 转换 API、s9api 转换 API 或 fn:transform() 函数。这些 API 中的每一个都让您有机会提供所需的 URI。
也许问题的最常见原因(但现在我猜)是您使用了 JAXP 转换 API,并指定为转换的目标 a StreamResult
包含Stream
或 Writer
但没有 systemId
.
(我有点惊讶你应该 link 另一个问题,我在其中给出了完全相同的信息,并强调要详细回答它,我们需要看看你是如何调用转换的.很多人会把它当作重复的来关闭...)