7

XML/XSLT を使用して、非常に大きくなる可能性のある aspx ページを作成しています。ファイルが正常に作成されても、ファイル サイズが 300K に近づくと、ブラウザでファイルを開くと、「CS1647: 式が長すぎるか複雑でコンパイルできません」というエラーが表示されます (IE と Chrome の両方を試しました)。失敗した .NET エラー ページには、その他の有益な情報は表示されません。

私の開発環境は、Win7 x64 ラップトップ上の VS 2012 Express for Web です。

この問題はプログラムの実行中には発生しないため、この問題を解決する方法について途方に暮れています。誰でも戦略を提案したり、この問題を回避したりできますか?

編集

aspx ページの作成に使用される C# コードは次のとおりです。

// load the xml file
XmlDocument reportDetails = new XmlDocument();
reportDetails.Load(ReportDetailsPath);
//setup the xslt transform
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(XlsRptPath);
StringWriter sw = new StringWriter();
xslt.Transform(ReportDetails, null, sw);
//create the aspx file
using (StreamWriter outfile = new StreamWriter(aspxPath))
{
    outfile.Write(sw.ToString());
}
4

2 に答える 2

1

解決策をすぐに投稿できなくて申し訳ありませんが、当時はストレスが多すぎて投稿できませんでした。私が推測するよりも遅いほうがいい。

関連する xml ファイルごとに完全な aspx Web ページを作成しようとする代わりに、スタブを作成し、関連する Site.Master 内から実行時に xslt 変換を適用しました。スタブのMasterPageFileプロパティは、この Site.Master に設定されます。このアプローチはパフォーマンスをいくらか犠牲にしますが、あらゆるサイズの Web ページで機能します。出力されたWeb ページの例を次に示します。

aspx スタブ ファイルの例:

<%@ Page Title="Top Austin Beauty Salons List" MetaDescription="List of best Google-ranked Austin beauty salon" Language="C#" MasterPageFile="~/Site1.Master" %>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
</asp:Content>

Site.Master Page_Load:

    protected void Page_Load(object sender, EventArgs e)
    {
        string vp =  Page.AppRelativeVirtualPath;
        if (vp.ToLower().EndsWith("default.aspx") || vp.ToLower().EndsWith("webform2.aspx")) return; // ignore some aspx files used for ohter reasons
        string xmlPath = Page.MapPath(vp.Substring(0, vp.LastIndexOf(".")) + @".xml");
        string xslPath = Page.MapPath("mainpage.xslt");
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlPath);
        XsltArgumentList argsList = new XsltArgumentList();
        argsList.AddParam("xmlPath", "", xmlPath);

        XslCompiledTransform xslt = new XslCompiledTransform();
        xslt.Load(xslPath);
        // Execute the transform and output the results to a string writer.
        StringWriter sw = new StringWriter();
        xslt.Transform(xmlDoc, argsList, sw);
        content.InnerHtml = sw.ToString(); // add the generated html to the associated stub aspx content section
    }
于 2014-08-18T18:42:50.460 に答える
1

古い質問で、コメントで大部分が回答されています。しかし、完全を期すために、答えましょう;)。あなたの問題は XSLT 自体にあるのではなく、生成されたファイルがC# の最大式サイズの 300k 境界に達しています。あなたができることがいくつかあります:

  • 生成されたコードを 300k 未満にします (ただし、これはあなたのケースでは不可能かもしれません)
  • 生成されたコード内の文字列定数を取得し、リソース ファイルに配置します。このようなリソース ファイルの形式は XML であり、自動生成できます。リソース内の ID が、生成された ASPX で使用する ID と一致していることを確認してください。
  • 生成されたコードの一部をコード ビハインド ファイルに配置します。ASPX は 1 つの式として解析されますが、分離コードはそうではありません。これは、生成されたコードの構造化の問題です。
  • 設計で許可されている場合は、ASPX を複数のページに分割します。それらをiframeで再結合できます。
  • ASPX ファイルを複数の ASCX コントロールに分割します。これはおそらく最も自然なことです。各 ASCX コントロールは、ASPX ファイルに参照/追加できます。各 ASCX コントロールは 300k の制限を超えてはなりません。
  • サイズを爆破する大量の生成された CSS がある場合は、別の CSS ファイルに配置します。
  • 画像参照などに長い絶対パスがたくさんある場合は、それらを折りたたんで相対参照にすることができます。つまり、 を使用する<base>と、スペースを節約できます。
  • エラーの原因が実際の大きな (定数) 式である場合は 、この投稿の回答のヒントを参考にして解決してください。
于 2014-08-18T13:12:58.953 に答える