XslLoadException:禁止解析外部 URI

问题描述 投票:0回答:2

我有 xslt 工作表,其中包含另一个 xslt 文件的标签,所有文件都正确编译且没有错误,但是当运行以下代码时,我遇到了异常

var myXslTrans = new XslCompiledTransform();
XsltSettings sets = new XsltSettings();
sets.EnableScript = true;
myXslTrans.Load("visio.xsl",sets,null);
myXslTrans.Transform("page1.xml", "page.html");

遵循异常文本和堆栈跟踪:

System.Xml.Xsl.XslLoadException: 
  XSLT compile error. An error occurred \bin\Debug\visio.xsl(116,40). 
  ---> System.Xml.XmlException: Resolving of external URIs was prohibited.
    at System.Xml.Xsl.Xslt.XsltLoader.Load(XmlReader reader)
       at System.Xml.Xsl.Xslt.XsltLoader.Load(Compiler compiler, Object stylesheet, XmlResolver xmlResolver)
       at System.Xml.Xsl.Xslt.Compiler.Compile(Object stylesheet, XmlResolver xmlResolver, QilExpression& qil)
       at System.Xml.Xsl.XslCompiledTransform.LoadInternal(Object stylesheet, XsltSettings settings, XmlResolver stylesheetResolver)
       at System.Xml.Xsl.XslCompiledTransform.Load(String stylesheetUri, XsltSettings settings, XmlResolver stylesheetResolver)

我尝试通过this解决问题,但问题仍然存在

c# xml xslt
2个回答
16
投票

引自评论/更新的问题:

我将文件复制到项目中以使用它,路径变量以获取应用程序的基目录

是的,但是没有使用path变量,所以没有效果。

System.Xml.Xsl.XslLoadException:XSLT 编译错误。 \Debug isio.xsl(116,40) 中发生错误。 ---> System.Xml.XmlException:禁止解析外部 URI。

这可能意味着以下一项或多项:

  • 您的设置不允许加载外部文档(这是
    XslCompiledTransform
    的默认设置,请参阅文档)。
  • 您的样式表直接(通过
    xsl:import
    xsl:include
    document()
    )或间接(通过 DTD 或解析外部实体)包含 URI。
  • 如果上述情况不(完全)正确,至少错误准确地指出了问题所在。您没有在问题中复制此内容,但您可以在 (116, 40) 找到它。

要解决此问题,只需允许加载外部文档

替换这个:

XsltSettings sets = new XsltSettings();
sets.EnableScript = true;

这样:

XsltSettings sets = new XsltSettings(true, true);

更新(发表评论后)

我注意到另一件事。您将最后一个参数设置为

null
,根据 Microsoft 的说法 应该给您一个
ArgumentNullException
。它不允许为空,但显然微软现在允许它,但它的效果是
UriResolver
无法解决任何问题,因为嘿,它是空的...

不太确定为什么将其设置为 null,但尝试将其设置为有效值,即:

var resolver = new XmlUrlResolver();
myXslTrans.Load("visio.xsl", sets, resolver);

0
投票

Ian of Oz的评论非常中肯,所以提倡回答。

在 .net Core 6.0(也可能更高版本)中,除了使用预期的

program.cs
 之外,您还必须在 
XsltSettings

的顶部添加以下内容
// override XmlException: Resolving of external URIs was prohibited.
AppContext.SetSwitch("Switch.System.Xml.AllowDefaultResolver", true);
// allow the use of the document() function in XSLT
var xsltSettings = new System.Xml.Xsl.XsltSettings(true,false);
var xslt = new XslCompiledTransform();
xslt.Load(path, xsltSettings, new XmlUrlResolver());
© www.soinside.com 2019 - 2024. All rights reserved.