例外"样式表太复杂"在.net 4.5中加载大型XSLT时
本文关键字:quot 加载 XSLT 大型 样式 复杂 例外 net | 更新日期: 2023-09-27 18:10:00
在尝试加载XSLT样式表时出现异常。XSLT样式表非常大(几乎有8000行)。不幸的是,我对此没有任何控制,而且我无法重构样式表使其更小。
我们最近升级到。net Framework 4.5。在升级之前,下面的命令工作得很好(我们使用的是。net Framework 4.0)。升级后,我们在transform.Load
行收到一个XsltException
,说"样式表太复杂"。
我希望有一些新的设置,会说"使这个命令的工作方式在4.0",但我找不到任何地方。
有没有人知道为什么这可能会突然成为4.5版本的问题?如何解决这个问题?
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(XmlReader.Create(report), new XsltSettings { EnableScript = true }, new XmlUrlResolver());
report
是包含大型XSLT样式表的MemoryStream。
原来这是。net Framework 4.5中的一个特性/缺陷。来自微软的消息…
我们最近在hotfix rollup中发布了这个修复。. net Framework 4.0见http://support.microsoft.com/kb/2828843, . net Framework 4.5见http://support.microsoft.com/kb/2828841。
然后把这个添加到你的配置文件中,问题就会消失。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="system.xml">
<section name="xslt" type="System.Xml.XmlConfiguration.XsltConfigSection, System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</sectionGroup>
</configSections>
<system.xml>
<xslt limitXPathComplexity="false"/>
</system.xml>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
</configuration>
我的问题解决了
我遇到了同样的问题,并将其隔离到机器生成的具有超过1500个xsl:when-elements的choice-element中。进一步的测试证明。net 4.7将在789处给出"太复杂"的异常,当-个元素或更多。
在app.config中设置limitXPathComplexity为false会导致程序崩溃,并抛出StackOverflowException。
同样的代码在。net Core 2.0在appx 2800个元素抛出StackOverflowException。我已经向两个团队报告了这个bug,但不要指望它很快就会被优先考虑。
我通过将用于键/值映射的数千个xsl:choose和xsl:if语句替换为外部xml文件键/值查找来解决此问题。
抄袭的方法在下面。
就XSLT而言,最好的方法是将查找数据作为XML文档,然后可以使用XSLT文档函数加载该文档。例如,如果您的查找XML格式为
<list>
<data key="k1" value="value 1"/>
<data key="k2" value="value 2"/>
<data key="k3" value="value 3"/>
</list>
那么使用XSLT,你可以这样做,例如
<xsl:variable name="data" select="document('lookup.xml')/list/data"/>
<xsl:for-each select="foo">
<xsl:value-of select="$data[@key = current()]/@value"/>
</xsl:for-each>
不需要xsl:choose。当然,文档函数不必加载静态文件,它可以向提供XML的HTTP服务器发出GET请求。
学分:https://social.msdn.microsoft.com/forums/en - us/9b5966a1 aa1e - 46 - db - 88 - f8 - 3 - f4a9aeadb5b/best -方式- -处理- - - - - - -查找- - xslt -数据- - - - - - -已经——————database?forum=xmlandnetfx
http://etutorials.org/XML/xml +黑客/+ 3章+转换+ XML +文档/攻击+ 56 + XSLT使用+查找表+ + + + +翻译+ FIPS +代码/