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 | |
技能 |
|
姓名 | 张敏 | 性别 | 男 | 生日 | 1988.7 | |||
技能 |
|
上面的代码思路非常的清晰:先写总体的建立模板,建立模板做好之后就是具体每一项技能的模板。由整体到局部,逐层细化。
<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元素。