站内搜索:     
站点首页破釜学院编程开发XSL教程 → XSLT的处理模型(5)
正在加载相关信息.....
Web 站内搜索
XSLT的处理模型(5)
】【打印】【加入收藏】【关闭收藏到新浪ViVi】【收藏到365KEY】 浏览字号:
日期:2004-08-02 人气: 出处:饮水思源站
解释到这里敏锐的读者都会发现两个问题:
1)     第一个XSLT文档没有<xsl:apply-templates />,为什么处理器能执行?
2)     第二个例子的<xsl:template match="/">不也是一个模板规则吗,它同样没有上一
层的<xsl:apply-templates />来调用,为什么可以被执行?
这问题的答案其实非常简单,大家知道,C语言的程序中,main函数是整个程序的入口,
程序的执行总是从这里开始,在XSLT中可以当然也必须做类似的规定,XSLT规范规定XS
LT处理器总是从一个模板最基本的模板开始做全部的处理,这个模板就是:
<xsl:template match="/">
XSLT处理器加载XML文档并将它处理成源树,接着XSLT处理器读入XSLT文档,并在文档中
找上述的模板,如果找到则开始处理,如果没有找到,XSLT调用默认得模板
<xsl:template match="/">
        <xsl:apply-templates>
</xsl:template>
开始整个处理过程。由此可见和C语言比较,XSLT唯一不同的地方在于它的"main函数"可
以不声明,这时它使用默认的"main函数"。
1.4     上下文
至此关于处理模型的讨论还没有结束,我们再看一下什么是上下文(context)。前面提
到<xsl:for-each select="name">的语义是对所有源树中的name元素节点应用for-each
元素定义的内容,这样的说法其实是不够严格的,我们看如下的例子:
<people>
<name>Tony</name>
<son>
<name>
Tony's son
</name>
</son>
</people>
在这个XML文档中,我们如果想得到所有的people元素的孩子name元素,而不想得到整个
文档中的name元素比如son元素的name孩子节点,这时应该如何处理?
一个适合的模板规则是:
<xsl:template match ="people ">
<xsl:for-each select="name"/>
</xsl:template >
在该规则中,select选择得到的name节点是people元素节点的孩子节点name,而不是它
的孙子节点name,虽然它们具有相同的名称。也就是说for-each指定只选择tony而不选
择tony's son。再看另外一个模板规则:
<xsl:template match ="son">
<xsl:for-each select="name"/>
</xsl:template >
这个模板规则除了match属性以外和上一个模板规则没有任何的不同,但是这个模板规则
内的for-each却能够得到son的name子元素。这里的区别在于当前一个模板被实例化的时
候,处理器处在people元素这一层,而后一个模板规则实例化的时候处理器已经向下"走
"了一层,它当前的位置在son元素一层。由此可见处理器的当前位置对于节点的选择来
说是何等地重要,为了更好的理解当前位置的概念,我们举一个生活中的例子,便于大
家的理解。

>>>> 进入论坛交流 <<<<