首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用xml类型在Server 2005中存储XSLT?

用xml类型在Server 2005中存储XSLT?
EN

Stack Overflow用户
提问于 2009-12-04 18:12:26
回答 2查看 2.1K关注 0票数 8

我的ASP.NET网络应用程序中有很多XSL文件。很多。我使用这种泛型转换方法生成了一堆AJAX HTML响应:

代码语言:javascript
复制
public void Transform(XmlDocument xml, string xslPath) 
{
    ...
    XslTransform myXslTrans = new XslTransform();
    myXslTrans.Load(xslPath);
    myXslTrans.Transform(xml,null, HttpContext.Current.Response.Output);        
}

我想使用xml类型的列将XSL定义移到Server中。我会在SQL中将整个XSL文件存储在一行中,并且每个XSL都是自包含的(没有导入)。我会将XSL定义从SQL中读出到我的XslTransform对象中。

就像这样:

代码语言:javascript
复制
public void Transform(XmlDocument xml, string xslKey) 
{
    ...

    SqlCommand cmd = new SqlCommand("GetXslDefinition");
    cmd.AddParameter("@xslKey", SqlDbType.VarChar).Value = xslKey;
    // where the result set has a single column of XSL: "<xslt:stylesheet>..." 
    ...

    SqlDataReader dr = cmd.ExecuteReader();
    if(dr.Read()) {
        SqlXml xsl = dr.GetSqlXml(0);
        XslTransform myXslTrans = new XslTransform();
        myXslTrans.Load(xsl.CreateReader());
        myXslTrans.Transform(xml,null, HttpContext.Current.Response.Output);     
    }   
}

这似乎是一个直截了当的方法:

  • 向每个XSL添加元数据,如lastUsed、useCount等。
  • 大容量更新/搜索功能
  • 防止大量磁盘访问
  • 避免引用相关路径和组织文件
  • 允许在不重新部署的情况下进行XSL更改(我甚至可以编写一个在数据库中选择/更新XSL的管理页面)

以前有人试过吗?有什么警告吗?

编辑

请注意,响应者已列出:

  • 磁盘访问不一定会减少
  • 这将破坏xsl:包括
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-04 18:26:20

我能看到的两大问题是:

  1. 我们使用大量的include来确保我们只做一次事情,在数据库中存储XSLT将阻止我们这样做。
  2. 这使得更新XSLs变得更有趣--我们非常高兴地将新的.xsl文件转储到已部署的站点中,而不对站点进行全面更新。因此,我们有一些代码可以在文件夹中查找特定于客户端的xsl,而这些代码可以返回到根中的公共代码(模板)--所以我根本不确定重新部署的内容,但是这在很大程度上取决于特定的用例,您的代码肯定与我们的不同。

关于磁盘访问,嗯.数据库仍然必须访问磁盘才能提取数据,如果您正在讨论缓存,那么数据库并不是启用缓存的必要条件。

必须就更新/搜索选项达成一致--您可以使用Powershell进行操作,但这需要在服务器上运行,这并不总是一个好主意。

从技术上讲,我认为没有理由不这样做(除了上面提到的愿望),但实际上,无论哪种方式,它似乎都与好的论点相当平衡。

票数 3
EN

Stack Overflow用户

发布于 2009-12-04 18:38:35

我将XSLT存储在应用程序dbscript中的数据库中。(不过,我将它们保存在NVARCHAR列中,因为它也运行在Server 2000上)

由于用户能够编辑自己的XSLT,所以我需要编写一个自定义验证器,它将TextBox的文本加载到.Net XslCompiledTransform对象中,如下所示:

代码语言:javascript
复制
    args.IsValid = true;

    if (args.Value.Trim() == "")
        return;

    try
    {
        System.IO.TextReader rd = new System.IO.StringReader(args.Value);
        System.Xml.XmlReader xrd = System.Xml.XmlReader.Create(rd);
        System.Xml.Xsl.XslCompiledTransform xslt = new System.Xml.Xsl.XslCompiledTransform();
        System.Xml.Xsl.XsltSettings xslts = new System.Xml.Xsl.XsltSettings(false, false);
        xslt.Load(xrd, xslts, new System.Xml.XmlUrlResolver());
        xrd.Close();
    }
    catch (Exception ex)
    {
        this.ErrorMessage = (string.IsNullOrEmpty(sErrorMessage) ? "" : (sErrorMessage + "<br/>") +
            ex.Message);
        if (ex.InnerException != null)
        {
            ex = ex.InnerException;
            this.ErrorMessage += "<br />" + ex.Message;
        }
        args.IsValid = false;
    }

至于你们的观点:

  • 文件I/O将被数据库生成的磁盘I/O所取代,因此不会获得任何收益。
  • 部署更改,以提供包含新数据的插入/更新脚本
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1848702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档