如何在IIS内运行时验证XSL而不会收到StackOverflowException?

时间:2015-12-10 19:52:12

标签: xml validation xslt

我有以下代码来验证传入的xsl:

string xsl = ...;
try
{
    var xslTransform = new XslCompiledTransform();
    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(xsl)))
    {
        using (var reader = XmlReader.Create(stream))
        {
            xslTransform.Load(reader, new XsltSettings(false, true), new XmlUrlResolver());
        }
    }
}
catch (XsltException ex)
{
    // Validation failed
}
catch (Exception ex)
{
    // Unexpected failure
}

不幸的是,对于某些XSL文档,代码在IIS中的ASP.NET请求中运行时会引发StackOverflowException

显而易见的解决方案是通过增加堆栈大小来提高标准,但这不是一个真正的解决方案 - 墨菲定律规定它将被复制并且至少在方便的时刻。

所以,我正在寻找另一种解决方案。建议其他XML / XSL框架也是受欢迎的。

您可以在此处找到示例XSL - http://pastebin.com/KWfrFYCW

编辑1

不幸的是,我们对XSL文档没有太多控制权 - 它们是由客户创建的。

编辑2

有趣的是,过时的XslTransform不会抛出SOE,但是,真正的XSL包含一些C#代码,所以我真的需要在{提供的启用脚本验证选项{1}}对象,XsltSettings

似乎不支持该对象

编辑3

由于Trying to use XslTransform to validate an XSL with a script fails显示XslTransform不支持我们的客户正在使用的XslTransform标记。不幸的是,我无法告诉每个客户端查看他们的XSL文件并在没有msxsl:using的情况下重写它们。因此我无法使用msxsl:using

编辑4

Saxon EE似乎运作良好。这是代码:

XslTransform

给定带有var processor = new Processor(); processor.NewXsltCompiler().Compile(new FileStream(XSL_PATH, FileMode.Open)); msxsl:script标记的XSL,不会抛出异常。我想这意味着Saxon EE确实理解了这些,不是吗?

0 个答案:

没有答案