XSL模板将XSL设计细化成一个个模板,最后再将这些模板组合成一个完整的XSL.一个主要的思路就是将整体划分为每一个部分。在后细化每一个部 分。它允许你先从整体考虑整个XSL的设计,然后将一些表现形式细化成不同的模块,再具体设计这些模块,最后将他们组合在一起。

 

XSL元素:<xsl:template>

<xsl:template>元素包含了当匹配指定节点时要应用的规则。match属性用于把模板关联到某一个XML元素。同时match属性也能用于为XML文档的全部分支定义模板(match="/" 定义了这个文档)

语法:

<xsl:template name="name" //name属性为模板定义名称,如果该属性省略,那么必须设置match属性 。可选

      match="pattern"          //模板的匹配模式,用于指定将模板应用在XML的什么地方。可选

     mode ="mode"          //为模板规定模式 (具体什么意思,自己也不清楚)。可选

    priority="number"     //规定模板的优先级编号。可选

>

< xsl:template>用match属性从XML选取满足条件的节点,针对这些特定的节点形成一个特定输出形式的模板。

只有<xsl:template>一个元素是没有什么作用。为了发挥模版的作用还必须和另外一个元素配合使用。


<xsl:apply-templates>调用模板

xsl 元素<xsl:apply-templates>元素可向当前元素或当前元素的子元素应用模板。如果我们向<xsl:apply- templates>元素添加select属性,那么仅仅会处理匹配该属性的值的子元素。我们可以使用select属性来规定处理子节点的顺序。

经 过实验,个人觉得。<xsl:apply-templates>的作用就是允许向下调用模版。当系统被允许向下调用模板之后。第一步得 到<xsl:apply-template>的内容。如果没有设置select那么就表示当前元素和当前元素的子元素。第二步,将第一步得到 的内容调用<xsl:template match=“条件”>指定的模版,并进行相应的输出。此过程可递归。

<xsl:apply-templates

     select="expression"    //确定在此上下文环境中应该执行什么模版,也就是开始选取<xsl:template>标记的模板。

      mode="name"   //如果存在为相同的元素定义多个处理方法,那么可用mode区分他们。可选

>

关于apply-templates元素的解释。w3school.com.cn网站上出现了严重的理解错误。

正确的解释请参考:http://www.blueidea.com/tech/web/2004/1797_3.asp这篇文章。


关于apply-templates在此举一例。本段在原文的基础上进行改进。如果需要查看原文,请参考:http://www.blueidea.com/tech/web/2004/1797_3.asp

需要处理的XML文件是一份简历,内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" hre f="test.xsl"?>
<resumes>
    <resume>
        <name>Tester</name>
        <sex>女</sex>
        <birthday>1988.10</birthday>
        <skill>web开发</skill>
    </resume>
    <resume>
        <name>张敏</name>
        <sex>男</sex>
        <birthday>1988.7</birthday>
        <skill>vc</skill>
        <skill>Joomla</skill>
        <skill>php</skill>
    </resume>
</resumes>

在同目录下的test.xls文件内容如下:


<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates select="resumes" />
            </body>
        </html>
    </xsl:template>

<!--简历模板 -->
<xsl:template match="resume">
    <table border="1px">
        <caption>个人简历</caption>
        <tr>
            <xsl:apply-templates select="name" />
            <xsl:apply-templates select="sex" />
            <xsl:apply-templates select="birthday" />            
        </tr>
        <tr>
            <td>技能</td>
            <td colspan="5">
                <table cellspacing="0">
                    <xsl:apply-templates select="skill" />
                </table>
            </td>
        </tr>
    </table>
</xsl:template>

<!-- 姓名模板 -->
<xsl:template match="name">
    <td>姓名</td>
    <td><xsl:value-of select="." /></td>
</xsl:template>

<xsl:template match ="sex">
    <td>性别</td>
    <td><xsl:value-of select="."/></td>
</xsl:template>

<xsl:template match="birthday">
    <td>生日</td>
    <td><xsl:value-of select="."/></td>
</xsl:template>

<xsl:template match="skill">
    <tr>
        <td><xsl:value-of select="."/></td>
        </tr>
</xsl:template>

</xsl:stylesheet>

执行的效果如下:

 

个人简历
姓名 Tester 性别 生日 1988.10
技能
web开发
个人简历
姓名 张敏 性别 生日 1988.7
技能
vc
Joomla
php

上面的代码思路非常的清晰:先写总体的建立模板,建立模板做好之后就是具体每一项技能的模板。由整体到局部,逐层细化。

 


<xsl:call-template>元素

<xsl:call-template>元素可调用一个指定的模板。

<xsl:call-template

      name="name"  //指定被调用模板的名称  必须。

>

 

 

 

对于XML模板来说,name属性是很关键的 call-template /apply-templat的name属性必须要和模板的name属性想对应。模板相当于一个函数,而name相当于函数名称。

 

在call-template中,使用xsl:with-param相当于函数参数输入。而参数声明就相当于xsl:template的xsl:param,

 


<xsl:apply-templates>元素

指示XSLT处理器根据每一个节点的类型和上下文找到适合应用的模板。

<xsl:apply-templates

 select = Expression

 mode = Qname

>

</xsl:apply-templates>

可以用于处理通过表达式选择的节点,而不是处理所有子级.select 属性的值是表达式(XML)。该表达式必须计算为节点集。除非指定了不同的排序顺序,否则,选定的节点集按文档顺序进行处理

mode属性允许多次处理其限定名指定的某一个元素,每次产生不同的结果。如果<xsl:template>没有match属性。它就不可能有mode属性。如果<xsl:apply-templates>元素有mode属性。该元素只适用于来自<xsl:template>元素的模板规则。这后一种元素具有带相同值的mode属性。如果<xsl:apply-templates>元素没有mode属性,该元素只适用于来自<xsl:template>元素的模板规则,这后一种元素没有mode属性。

<xsl:apply-templates>元素首先使用在select属性中指定的表达式选择一组节点。如果未指定此属性,将选择当前节点的所有子级。对每一个选定的节点<xsl:apply-templates>指示XSLT处理器找到一个适当的<xsl:template>加以应用。通过将节点和模板的match属性中指定的XPath表达式j进行比较,测试模板是否适用。如果有多个模板满足匹配模式,将选择其中优先级别最高的模板。如果有多个模板的优先级相同,将选中样式表中最后一个模板。

 


xsl-call-template使你能够调用一个分配的name属性的命名模板。如果<xsl:template>元素有name属性,它可能也有但不一定会有match属性。<xsl:call-template>元素按照名称调用模板,必须有name属性。与<xsl:apply-templates>不同,<xsl:call-template>不更改当前节点或当前节点列表。

<xsl:call-template>元素可以包含任意多个<xsl:with-param>元素。但是,不能够包含其他的XSLT元素。


收藏
0个人 收藏