我有以下代码来验证传入的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确实理解了这些,不是吗?