6

XSLT スタイルシートを読み込もうとすると例外が発生します。XSLT スタイルシートは非常に大きい (約 8,000 行)。残念ながら、これを制御することはできず、スタイルシートをリファクタリングして小さくすることもできません。

最近、.Net Framework 4.5 にアップグレードしました。以下のコマンドは、アップグレード前は問題なく機能していました (.Net Framework 4.0 を使用していました)。アップグレード後、XsltException「スタイルシートが複雑すぎます」というメッセージが表示されますtransform.Load

「このコマンドを 4.0 と同じように機能させる」という新しい設定があることを期待していましたが、どこにも何も見つかりませんでした。

これが 4.5 バージョンで突然問題になる理由を知っている人はいますか? どうすれば解決できますか?

XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(XmlReader.Create(report), new XsltSettings { EnableScript = true }, new XmlUrlResolver());

report大きな XSLT スタイルシートを含む MemoryStream です。

4

3 に答える 3

10

これは、.Net Framework 4.5 の機能/欠陥であることが判明しました。マイクロソフトからのメッセージ...

最近、ホットフィックス ロールアップでこれに対する修正をリリースしました。.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>

これで私の問題は解決しました。

于 2013-05-02T14:54:33.743 に答える
2

私は同じ問題を抱えていて、それを 1500 以上の xsl:when 要素を持つ機械生成の選択要素に分離しました。さらにテストを行った結果、.NET 4.7 では 789 の when-elements 以上で「複雑すぎる」例外が発生することが証明されました。

app.config で limitXPathComplexity を false に設定すると、代わりに StackOverflowException でプログラムがクラッシュします。

.NET Core 2.0 の同じコードは、appx 2800 要素で StackOverflowException をスローします。私は両方のチームにバグを報告しましたが、すぐに優先されるとは思っていません。

于 2018-02-18T11:03:17.407 に答える
0

キー/値マッピングに使用されている何千もの 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-46db-88f8-3f4a9aeadb5b/best-way-to-handle-a-lookup-in-xslt-data-is-すでにデータベースにある?forum=xmlandnetfx

http://etutorials.org/XML/xml+hacks/Chapter+3.+Transforming+XML+Documents/Hack+56+Use+Lookup+Tables+with+XSLT+to+Translate+FIPS+Codes/

于 2018-03-20T10:55:12.443 に答える