例外"样式表太复杂"在.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 4.5中加载大型XSLT时

原来这是。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 +代码/