template模板在XSLT中是一个很重要的工具,通过匹配的方法用来处理XML文档。
操作作顺序,阅读器逐行读取XML文件,若遇到某一个元素在XSLT中有相关模板,就根据模板的规则处理元素内的数据,例如
<xsl:template match=””>
<xsl:value-of select=”.”/>
</xsl:template>
通过”/”,匹配XML的根元素,那么在阅读器读取到XML(等于开始读取XML文本)的根元素时,将通过这个模板的设置进行数据处理,这个命令是输出非标签文本。
例如只使用:
<xsl:template match=””>
</xsl:template>
由于里面没有使用任何的对匹配文本的处理方式,那么输出结果为空。
那么假如处理下面的XML:
<aa>
<bb>
bbb
</bb>
<cc>
ccc
</cc>
<dd>
ddd1
</dd>
<dd>
ddd2
</dd>
</aa>
XSLT只有一个模板
<xsl:template match=”cc”>
<h1><xsl:value-of select=”.”/></1>
</xsl:template>
那么输出结果,只有ccc被标题化,其他的只是纯文本拷贝。
因此我们还可以使用另外一个template去处理剩下的标签。
需要注意的是,一当根元素给”/”匹配了之后,那么剩下来的的模板就不在匹配任何的元素了,这种情况下也就是通常XSLT写法。
XSLT文件其实是一个或者多个XML文件的样式表,里面包含的功能会很丰富,因此在整个XSLT文件中有许多的template模板,模板与模板之间通过以下两种方式来来穿插使用:
<xsl:apply-templates>
<xsl:call-template>
这两个功能都是调用其他的模板,但是有所区别:
<xsl:apply-templates>,是在匹配到某个元素的时候,才采用模板,因此一定需要在XML文件中存在这个元素,如果不存在,将不进行任何操作。
调用例子:
<xsl:template match=”/”>
<xsl:apply-templates select=”cc”/>
</xsl:template>
<xsl:template match=”cc”>
处理的内容
</xsl:template>
<xsl:call-tempalte>,是直接调用一个模板,并将需要处理的数据通过<xsl:with-param>形式传递给模板,就想编程语言中的函数一样。
调用例子:
<xsl:template match=”/”>
<xsl:call-template name=”template-name”>
<xsl:with-param name=”name1″ select=”cc”/>
<xsl:with-param name=”name2″>
<xsl:value-of select=”cc”/>
</xsl:with-param>
</xsl:template>
<xsl:template name=”template-name”>
<xsl:param select=”name1″>
<xsl:param select=”name2″>
处理内容
</xsl:template>
<xsl:call-template name=”name1″>, 这里虽然选择了name1,但是这个name1并不是XML文中的元素,而是直接调用模板name1。
这里我们也简单的说一下两个<xsl:with-param>的区别:
前面一个直接带select的标签,它的功能是传递元素cc给模板,再通过模板来处理cc下面的其他数据
后面一个不带的标签,根据上面的定义,它只是传递cc的值给模板。
假如说,传递给模板的元素带有其他的标签,就像前一个传递的内容一样,可以通过xslt的功能处理
如<xsl:value-of select=”.”/>取cc元素及其子元素中的所有纯文本。
在这里我曾遇到一个问题,那么就是在传递”格式化的文本“给模板的时候,我只想添加其他的格式标签并要保留文本内的其他格式标签,这个时候需要用到的是<xsl:copy>和<xsl:copy-of>,具体的例子就不说啦,等下次写到<xsl:copy>和<xsl:copy-of>的时候再说啦。
发表回复