Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用从字符串创建的XmlTestReader进行XslCompiledTransform不能转换_C#_Xslt - Fatal编程技术网

C# 使用从字符串创建的XmlTestReader进行XslCompiledTransform不能转换

C# 使用从字符串创建的XmlTestReader进行XslCompiledTransform不能转换,c#,xslt,C#,Xslt,我对XslCompiledTransform类有问题。 如果我尝试运行此代码: string pathToXsltFile, pathToInputFile, pathToOutputFile; XsltSettings xsltSettings = new XsltSettings(true, true); XslCompiledTransform myXslTransform = new XslCompiledTransform(); XmlTextReader reader = new X

我对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:

并尝试运行:

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."
InnerException。消息:

"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)
关于文档功能,我明天要问一下。我从另一个人那里得到了xslt文件

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

myXslTransform.Load(pathToXsltFile, xsltSettings, new XmlUrlResolver());
myXslTransform.Transform(pathToInputFile, pathToOutputFile);
而且也很好


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

我认为这是由于您手动将内存流的位置设置为0;你把XmlTextReader弄糊涂了

我尝试了上面的方法,当我评论这句话时,它对我来说很好


您将其设置为0有什么特别的原因吗?

我认为我们需要查看XSLT以及它对
文档的任何调用。一般来说,您需要知道,它有第二个参数,可以作为基本URI来解析由第一个参数生成的URI。没有像在中那样传入第二个参数,例如
,样式表代码本身提供了基本URI。如果从字符串加载样式表代码,该机制可能不会像从文件系统或HTTP URI加载样式表那样解析URI。该问题的解决方案取决于要加载的资源的位置以及该位置与主输入文件的关系。如果您希望从与主输入文档相同的位置加载
foo.xml
,然后执行
document('foo.xml',/)
而不是
document('foo.xml')

假设这个问题是关于在.Net核心应用程序中使用XslCompiledTransform的,我找到了以下问题的答案:网站上的“相对URI不支持此操作。”

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

“我相信您正在遇到已知的兼容性更改。NET核心默认情况下不允许解析XML的外部URI,本文对此进行了说明

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

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

当我加上

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
在启动时,错误“相对URI不支持此操作”消失了。此时,使用XmlReader调用Load时发生了一个新错误,该错误与查找XSL文件引用的其他文件有关。然后,当我将文件路径传递给加载中的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();
}

我添加这一点是为了帮助其他人调试为什么XSLCompiledTransformThows“相对URI不支持此操作。“在.net core中。

在哪一行获得异常?pathToInputFile是相对路径吗?请向我们显示完整的异常消息、导致异常的语句、堆栈跟踪等详细信息,并告诉我们样式表代码是否尝试解析相对URL(样式表代码是否使用
文档
函数)。我对该行进行了注释,我有相同的异常:{“加载文档“”时出错。有关错误的完整描述,请参阅InnerException。”}InnerException:“相对URI不支持此操作。”好的,然后我们将需要Martin Honnen建议的更多信息。我已要求提供另一个xslt文件。未使用document Function。现在它可以工作了。感谢帮助。”
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
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();
}