标签: xslt

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