77家的会客2010

考察xsl:for-each和xsl:template的不同
Weather:中雨转多云 北风5-6级 (5~10)℃

有时候,XML程序员开发XSL转换工具时, 会面对很难做决定的局面。是否用xsl:for-each取代xsl:template,如果是,那么什么时候呢?让我们围绕这个话题考察一些情况,很有可能就可以找到一个在实践中被接受的而又更加清晰的方法。

 

主要不同点:

使用xsl:for-eachxsl:template主要不同点是:一个是迭代(循环)函数,而另一个是递归的函数。本质上而言,这就意味着他们处理的方法有着根本上的区别。

用for-each,一次循环,元素会通过所选择的属性匹配一次,for-each循环开始和结束标签之间的指令会根据元素来处理。

而模板是不同的。当xsl:apply-templates被调用时,在不同的上下文中,每个与模板规则匹配的元素会作为节点提交给模板规则。那么,所有的模板中的指令会对节点进行处理。这个不同是微秒的,更重要的是结果通常是一样的。

XSL模板:

通常建议XML的初学者避免使用for-each,因为它会导致不好的XSL实施,就像避免模板,错乱的代码和其他令人讨厌的XSL。取而代之的是,建议大多数开发者去学习如何正确地应用模板规则,因为它是XSL的真正的肥肉。

模板最明显的优点是:由于他们具有像子程序一样的行为,因此能被重用。它不仅使多次调用模板更容易,而且更加容易修改代码。当模板需要更新时,你就能一下子改变它。而当几个for-each需要更新时,你不得不手动更新每个部分。

模板也能帮助开发者创建更容易跟踪的分割代码。通过检查XSL的模板,可以更容易地弄清发生了什么,而不用再去关心for-each声明那样的具体内容了。

使用模板唯一不好的地方是:对于已经一定有经验的开发者来说学习模板没有for-each那么直观。

For-each:

xsl:for-each指令已经变成XSL的累赘了。虽然避免学习它对那些刚刚开始学习XSL的人来说也许是个好建议,但是xsl:for-each还是有一些优点的。

首先,弄清楚在XSL模板里发生了什么,就能让学习变得更加容易。你可以观察迭代子,看发生了什么,而不是试图揣摩它调用了哪个模板。对于一个短小的代码片段,一个更加有价值的调试技术是把模板代码放到for-each循环中去。
 

把XML文档转换到一个非XML语法的文档时,for-each循环就很有价值了。很明显对XML来说,使用模板是很有意义,但是一个for-each能摆脱XML某些规则的束缚,使结构变得更清楚。
 

for-each一个问题是:相对使用模板而言,你不得不对文档结构了解得更加清楚。模板会递归匹配多次,而使用for-each,你不得不显式地迭代每个子元素——这就要求你知道哪些是子元素。
 

是否赞同使用for-each的一个很常见争论是性能。很明显,调用for-each比模板更加有效。当然,这依赖于特殊的XSL引擎和模板的设计。而且,很多性能可以通过良好的设计和更好的硬件来提高。

最后的分析:
 

那么哪个方法更好呢?如果你打算重复使用相同的代码,有很多元素要调用,要处理更加复杂的XML数据,那么模板就是你的选择。对于那些你需要开发,调试,而数据相对简单,不必改写多少的情况,for-each就让你很顺利。然而需要记住的是:项目增长并将变得更加复杂,因此未雨绸缪和学会如何正确地使用和应用模板是一条需要遵守的好的准则。

历史上的今天: [2008/10/28]System.Data.Sqlite 上手指南
[2008/10/28]C#压缩SQLite数据库
[2005/10/28]成功就是简单的事情重复做、重复做

[考察xsl:for-each和xsl:template的不同]的回复

littlenew 于 2008-06-27 15:44:53 发表 | IP:218.18.129.*

请问VML是不是只能在IE下运行???那在其它的浏览器下有没有实现图表的什么语言?

柠檬园主 于 2008-06-27 20:52:29 发表 | IP:124.93.18.*

斯米麻森嘎...俺没用过VML....

Post a Comment~