|
XSLT的处理模型(5)
|
|
| |
|
来源:XSLT.org.cn 作者:XSLT专业站 发布时间:2007-08-04
|
|
XSLT的处理模型(5)
解释到这里敏锐的读者都会发现两个问题:
1) 第一个XSLT文档没有<xsl:apply-templates />,为什么处理器能执行? 2) 第二个例子的<xsl:template match="/">不也是一个模板规则吗,它同样没有上一层的<xsl:apply-templates />来调用,为什么可以被执行?
这问题的答案其实非常简单,大家知道,C语言的程序中,main函数是整个程序的入口,程序的执行总是从这里开始,在XSLT中可以当然也必须做类似的规定,XSLT规范规定XSLT处理器总是从一个模板最基本的模板开始做全部的处理,这个模板就是:
<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元素一层。由此可见处理器的当前位置对于节点的选择来说是何等地重要,为了更好的理解当前位置的概念,我们举一个生活中的例子,便于大家的理解。
标题: XSLT的处理模型(5)
关键字:处理模型 模板 元素 XSLT 规则 节点 处理器
|
| 上一篇:XSLT的处理模型(4) 下一篇:XSLT的处理模型(6) |
|
|
|
|
|