我正在使用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());
}
答案 0 :(得分:1)
老问题,并在评论中大致回答。但为了完整起见,让我们回答它;)。您的问题不在于XSLT本身,而在于生成的hits the 300k boundary of maximum expression size in C#文件。你可以做几件事:
<base>
,可以节省一些空间。答案 1 :(得分:1)
我很抱歉没有尽快发布我的解决方案,但当时我太紧张了。迟到总比我想的要好。
我没有尝试为每个关联的xml文件创建一个完整的aspx网页,而是创建了一个存根,并在运行时从关联的Site.Master中应用了xslt转换。存根的 MasterPageFile 属性设置为此Site.Master。这种方法确实牺牲了一些性能,但它适用于任何规模的网页。以下是输出 webpage的示例。
示例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
}