C# 何时将xml与xsl而不是HTML结合使用?
我喜欢.NETWebControl,你可以操纵东西,这是大家的共识,但XML和XSL非常棒,因为你有独立于平台和语言的UI逻辑,所以有一天我会将应用程序更改为php、java或其他任何形式,我可以重用所有的表示逻辑。 此外,XSL还可以在呈现之前调用.NET(或其他)方法C# 何时将xml与xsl而不是HTML结合使用?,c#,.net,php,xml,xslt,C#,.net,Php,Xml,Xslt,我喜欢.NETWebControl,你可以操纵东西,这是大家的共识,但XML和XSL非常棒,因为你有独立于平台和语言的UI逻辑,所以有一天我会将应用程序更改为php、java或其他任何形式,我可以重用所有的表示逻辑。 此外,XSL还可以在呈现之前调用.NET(或其他)方法 您通常什么时候使用XML/XSL?为什么不更频繁地使用它呢?在ASP.NET的东西中没有这么多,但在那之前(使用VB6),我几乎只在服务器上使用它来将xml转换为html。我一直觉得它的用途非常广泛。我还在我的“”项目中使用它
您通常什么时候使用XML/XSL?为什么不更频繁地使用它呢?在ASP.NET的东西中没有这么多,但在那之前(使用VB6),我几乎只在服务器上使用它来将xml转换为html。我一直觉得它的用途非常广泛。我还在我的“”项目中使用它作为代码生成器引擎:主框架生成xml,然后我使用xsl转换输出C。我听人说他们觉得xsl不直观,但我真的很喜欢它,而且它是我处理xml时的默认ttool 现在,我正在研究ASP.NET MVC,它不一定非常适合xsl——尽管在某些方面,
和
之间的差别不大,而不是HTML
我经常使用它来代替asp.net控件,因为它为2.0中的V和C提供了分离关注点的功能,而在.NET2.0中则没有这种功能
显然还有一百万个与asp.net控件无关的其他用途
编辑:实现的草图
public class xsltmanager
{
/* constructor (singleton) which defines a file watcher for *.xsl in the path of your choice */
//just a mutex for thread safety
private object Mutex = new object();
//caching XslCompiledTransforms
private Dictionary<string, XslCompiledTransform> cTransforms = new Dictionary<string, XslCompiledTransform>();
public XslCompiledTransform fetch(string identifier)
{
if (!this.cTransforms.ContainsKey(identifier))
{
lock (this.Mutex)
{
if (!this.cTransforms.ContainsKey(identifier))
{
XslCompiledTransform xslDoc = new XslCompiledTransform();
xslDoc.Load(/* file path based on identifier */);
this.cTransforms.Add(identifier, xslDoc);
}
}
}
return this.cTransforms[identifier];
}
/* other util xslt methods - namespace wash, doc merge, whatever */
}
public class myPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//get source data
XPathDocument xPathDoc = myGetXMLMethod();
//transform params
XsltArgumentList oArgs = new XsltArgumentList();
/* add params as required */
//fetching and executing the transform directly to the Response here
xsltmanager.instance.get(@"foo\bar\baz").Transform(xPathDoc, oArgs, Response.OutputStream);
}
}
公共类xsltmanager
{
/*构造函数(singleton),它在您选择的路径中为*.xsl定义一个文件监视程序*/
//只是一个线程安全互斥体
私有对象互斥=新对象();
//缓存XslCompiledTransforms
私有字典cTransforms=新字典();
公共XslCompiledTransform获取(字符串标识符)
{
如果(!this.cTransforms.ContainsKey(标识符))
{
锁(this.Mutex)
{
如果(!this.cTransforms.ContainsKey(标识符))
{
XslCompiledTransform xslDoc=新的XslCompiledTransform();
加载(/*基于标识符的文件路径*/);
this.cTransforms.Add(标识符,xslDoc);
}
}
}
返回此.cTransforms[标识符];
}
/*其他util xslt方法-名称空间清洗、文档合并等等*/
}
公共类myPage:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
//获取源数据
XPathDocument xPathDoc=myGetXMLMethod();
//变换参数
XsltArgumentList oArgs=new XsltArgumentList();
/*根据需要添加参数*/
//在这里直接获取并执行对响应的转换
xsltmanager.instance.get(@“foo\bar\baz”).Transform(xPathDoc、oArgs、Response.OutputStream);
}
}
使用XML/XSL会带来巨大的开销,并且有许多缺点
如果您关心逻辑分离,请使用一些模板语言(不是XSL)。首先,我在需要以HTML形式表示信息时使用XSLT。在过去的七年里,每当我偏离这一点,我都会后悔。我在Python中生成HTML的短暂经验是我遇到的唯一可能替代它的东西。如何将它与.NET集成?基本上只是根据codebehind中的Response.OutputStream进行转换。如果你不介意,你能提供一些.aspx(或其他)的集成代码吗使用xml/xsl?非常感谢,我拒绝所有这一切:xsl不是一个逻辑引擎,它是一个表示引擎。XSLT的模板化“逻辑”非常强大,在任何给定框架中都非常一致。鉴于该语言是为模板设计的,它的速度也非常快。缓存以避免文件IO并使用XPathdoct。这个答案在所有细节上都与我的经验完全相反。我甚至不知道“XSL逻辑控制很差”可能是什么意思。