以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  小谈XSL继承(争做版主大放血)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=50381)


--  作者:hexun831012
--  发布时间:7/23/2007 12:40:00 PM

--  小谈XSL继承(争做版主大放血)
XSL支持import和include,这使XSL实现继承成为可能,import和include从功能的角度上看区别不大,但从继承的角度上看有着本质的区别。
在说明XSL继承之前,首先要说明XSL模板的优先级问题,稍微了解XSL的人都知道,XSL的模板是自下而上进行解析的,也就是说文档下方的模板具有较高的优先级,如果文档中的模板相互交叉,那么下方的模板将覆盖上方的模板:
<xsl:template match="*">
  <b>
    <xsl:value-of select="." />
  </b>
</xsl:template>
<xsl:template match="node">
  <xsl:value-of select="." />
</xsl:template>
这个例子最能说明问题,node节点将被下方的模板拦截,而其他节点将交给上方的模板解析,这就说明了模板的顺序对文档来说非常重要,而import和include最大的区别就在于顺序。
import是顶级元素,它必须放在任何模板之前,这是一个良好的特性,import导入文档的模板将放在当前文档的最上方,他们的优先级相对于当前文档较低,也就是说如果模板相互交叉,那么当前文档的模板将覆盖导入文档的模板,这就是实现了重写!!!这种方式最类似于JAVA,他在默认情况下是可重写的:
base.xsl
<xsl:template match="text()"/>
  <xsl:value-of select="." />
</xsl:template>
use.xsl
<xsl:import href="base.xsl" />
<xsl:template match="text()"/>
  <b>
    <xsl:value-of select="." />
  </b>
</xsl:template>
use.xsl的text()模板覆盖了base.xsl中的模板,也就是重写,而include和import不同,它可以放在文档的任何位置,如果放在文档的最下部,那就意味着导入文档的模板的优先级高于当前文档的模板,也就是封装!!!这种方式最类似于.NET,默认情况下不可重写:
base.xsl
<xsl:template match="text()"/>
  <xsl:value-of select="." />
</xsl:template>
use.xsl
<xsl:template match="text()"/>
  <b>
    <xsl:value-of select="." />
  </b>
</xsl:template>
<xsl:include href="base.xsl" />
use.xsl的text()模板无法覆盖了base.xsl中的模板,也就是封装,如果想实现部分重写,有两种方式,第一,是手动分配模板的优先级,当然这种方式比较繁琐,还有一种方法就是把include放在文档中部,把不需要重写的放在上面,把需要重写的放在下面,当然这种情况比较少。
我所推荐的是使用import,从逻辑上说,可重写的模式对XSL来说比较合理,对于开发人员来说,这种模式既继承了基类的模板,又不用关心基类的细节,如果文档多次继承,那么文档之间有着良好的层次结构,这就为XSL的模块化,层次化提供了可能


--  作者:hexun831012
--  发布时间:7/23/2007 12:44:00 PM

--  
申请精华,争做版主
--  作者:gogy
--  发布时间:7/25/2007 2:36:00 PM

--  
才看明白你这篇文章的意思。我的个人观点就是,这篇文章除了“import是顶级元素,它必须放在任何模板之前”这句话外,通篇的理解都是有问题的。
>>>>>>>>>
XSL的模板是自下而上进行解析的,也就是说文档下方的模板具有较高的优先级,如果文档中的模板相互交叉,那么下方的模板将覆盖上方的模板
<<<<<<<<<<<<
这句话问题最大,XSLT模板的优先级是由priority属性决定的,可不是由上下顺序决定的。如果没有显式指定该属性,则有一套计算规则存在。

>>>>>>>>>
这个例子最能说明问题,node节点将被下方的模板拦截,而其他节点将交给上方的模板解析,这就说明了模板的顺序对文档来说非常重要
<<<<<<<<<<<<<<<
其实,你举的例子最不能说明问题,不要被表面现象所迷惑了。不信,你把两个模板颠倒上下顺序试试。

<<<<<
import是顶级元素,它必须放在任何模板之前,这是一个良好的特性,import导入文档的模板将放在当前文档的最上方,他们的优先级相对于当前文档较低,也就是说如果模板相互交叉,那么当前文档的模板将覆盖导入文档的模板,这就是实现了重写!!!这种方式最类似于JAVA,他在默认情况下是可重写的
>>>>>>
这可不是因为import放在前面才使得它的优先级最低,而是W3C规范这样规定的。当然import导入的模板优先级要高于默认模板的优先级。
其他的,就不多说了,楼主不是专业的XSLT程序员,XSLT的知识还是欠缺一点。,但是,想象力很丰富。。

所以,import和include等等,跟JAVA的继承等,没有任何关系和相似性。

另外,欢迎讨论,


--  作者:hexun831012
--  发布时间:7/25/2007 3:09:00 PM

--  
楼上的说话要负责任,连XSL的解析顺序都不知道,还自称专业,真是自视甚高,好好看看W3C的文档和XSL解析原理,你把代码反来试试看!
我的确不是XSL程序员,技术实现不是我的工作重心,但就技术论技术我也不比有些人差。


--  作者:gogy
--  发布时间:7/25/2007 3:32:00 PM

--  
生气了不是?我可没有攻击你的意思,可是你却搞人身攻击,这不好吧?

》》》》》》
我的个人观点就是,这篇文章除了“import是顶级元素,它必须放在任何模板之前”这句话外,通篇的理解都是有问题的。
《〈〈〈〈〈〈〈

我只是说出自己的观点。你不认同我的观点就算了,大不了,不讨论了嘛。


--  作者:hexun831012
--  发布时间:7/25/2007 3:57:00 PM

--  
抱歉,抱歉
--  作者:gogy
--  发布时间:7/26/2007 10:44:00 AM

--  
呵呵,其实,我的意思不是“专业”和“业余”,我是想说“专职”来着。

admin老大,发过好几条回帖奖励给我。这篇回帖又有。是系统自动发的,还是admin仔细看过呢?


--  作者:admin
--  发布时间:7/27/2007 1:15:00 AM

--  
以下是引用gogy在2007-7-26 10:44:00的发言:
呵呵,其实,我的意思不是“专业”和“业余”,我是想说“专职”来着。

admin老大,发过好几条回帖奖励给我。这篇回帖又有。是系统自动发的,还是admin仔细看过呢?


嗯。因为你积极参与交流,发表自己的看法。所以就奖励了。因为一天站上贴子很多,无法一一细看了 :-)


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
109.375ms