2

我对 XslCompiledTransform 类有疑问。如果我尝试运行此代码:

string pathToXsltFile, pathToInputFile, pathToOutputFile;
XsltSettings xsltSettings = new XsltSettings(true, true);
XslCompiledTransform myXslTransform = new XslCompiledTransform();
XmlTextReader reader = new XmlTextReader(pathToFile);
myXslTransform.Load(reader, xsltSettings, new XmlUrlResolver());
myXslTransform.Transform(pathToInputFile, pathToOutputFile);

它工作正常。但是,如果我想从字符串(文本)创建 XmlTextReader:

MemoryStream mStrm = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(text));
XmlTextReader xmlReader = new XmlTextReader(mStrm);
mStrm.Position = 0;

并尝试运行:

myXslTransform.Load(xmlReader, xsltSettings, new XmlUrlResolver());
myXslTransform.Transform(pathToInputFile, pathToOutputFile);

我得到一个例外:

"this operation is not supported for a relative uri"

由于某些原因,我不想创建临时文件并从该文件的路径创建 XmlTextReader。

编辑

完整的异常消息:

"An error occurred while loading document ''.
See InnerException for a complete description of the error."

内部异常消息:

"This operation is not supported for a relative URI."

堆栈跟踪:

at System.Xml.Xsl.Runtime.XmlQueryContext.GetDataSource(String uriRelative, String uriBase)
at <xsl:template match=\"gmgml:FeatureCollection\">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current)
at <xsl:apply-templates>(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator )
at Root(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
at Execute(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer, Boolean closeWriter)
at System.Xml.Xsl.XmlILCommand.Execute(XmlReader contextDocument, XmlResolver dataSources, XsltArgumentList argumentList, Stream results)
at System.Xml.Xsl.XslCompiledTransform.Transform(String inputUri, String resultsFile)
at MyNamespace.ApplyXslTransformation1(String input, String output, String xsltFileName)

导致异常的语句:

myXslTransform.Transform(pathToInputFile, pathToOutputFile);

关于文件功能我明天要问。我从另一个人那里得到了 xslt 文件。

当我从 xslt 文件的路径创建 XmlTextReader 文件时,一切都很好。我也尝试使用:

myXslTransform.Load(pathToXsltFile, xsltSettings, new XmlUrlResolver());
myXslTransform.Transform(pathToInputFile, pathToOutputFile);

它也很好。

现在我得到了加密的 xslt。我已经解密它,我想从解密的字符串创建 XmlTextReader。由于安全原因,我不会创建临时 xslt 解密文件。

4

3 回答 3

2

我认为我们需要查看 XSLT 以及document对它所做的函数的任何调用。通常,您需要注意document函数具有第二个参数,该参数可以作为基本 URI 来解析由第一个参数产生的 URI。如果不传入第二个参数,例如<xsl:value-of select="document('foo.xml')"/>样式表代码本身就提供了基本 URI。如果您从字符串加载样式表代码,则该机制可能无法像从文件系统或 HTTP URI 加载的样式表那样解析 URI。该问题的解决方案取决于您要加载的资源的位置以及它与主输入文件的关系。如果您想foo.xml从与主输入文档相同的位置加载,那么做document('foo.xml', /)而不是document('foo.xml')应该工作。

于 2012-12-06T17:00:05.330 回答
0

我认为这是由于您将内存流的位置手动设置为 0 造成的;你混淆了 XmlTextReader。

我尝试了上述方法,当我评论那条线时它对我来说很好。

您将其设置为 0 是否有特殊原因?

于 2012-12-06T14:21:08.613 回答
0

假设这个问题是关于在 .Net Core 应用程序中使用 XslCompiledTransform,我找到了“相对 URI 不支持此操作”的答案。在网站https://github.com/dotnet/corefx/issues/31390

相关答案(由 vcsjones 于 2018 年 7 月 26 日评论)是:

“我相信您遇到了已知的兼容性更改。默认情况下,.NET Core 不允许解析 XML 的外部 URI,并在此处记录。

正如文档所说,如果您愿意,可以通过放置

AppContext.SetSwitch("Switch.System.Xml.AllowDefaultResolver", true); 在您的应用程序中。尝试将它放在示例程序的顶部。”

当我添加

AppContext.SetSwitch("Switch.System.Xml.AllowDefaultResolver", true);

作为顶线

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

在启动时,错误“相对 URI 不支持此操作”消失了。那时,使用 XmlReader 调用 Load 时发生了一个新错误,该错误与查找 XSL 文件引用的其他文件有关。然后,当我将文件路径传递给 Load 中的 xsl 时,一切都按预期工作。

var resolver = new XmlUrlResolver {Credentials = CredentialCache.DefaultCredentials};
var transform = new XslCompiledTransform();
transform.Load(XslPath, new XsltSettings(true, true), resolver);

var settings = new XmlWriterSettings {OmitXmlDeclaration = true};
using (var results = new StringWriter())
using(var writer = XmlWriter.Create(results, settings))
{
    using (var reader = XmlReader.Create(new StringReader(document)))
    {
        transform.Transform(reader, writer);
    }

    return results.ToString();
}

我添加这个是为了帮助其他人尝试调试为什么 XslCompiledTransform 会出现“相对 URI 不支持此操作”。在.net 核心中。

于 2019-07-10T21:11:55.380 回答