xslt结构,template/call-templates/apply-templates调用

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>的时候再说啦。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据