跟我学XSL(三)——XSL模板与匹配模式(0分)

  • 主题发起人 主题发起人 honestman
  • 开始时间 开始时间
H

honestman

Unregistered / Unconfirmed
GUEST, unregistred user!
  经过前几日的学习,我们学习了XHTML文档的编写和以及三个XSL元素,已能编写相当灵
活的XSL文档,今天将学习的是XSL模板的编写。我们都知道,短的文档、程序十分好读,但
当规模增大后,其复杂性也以更快的速度增加。
  前面我们学了<xsl:for-each>、<xsl:value-of>等,可以用它们对XML数据实现简单的
格式化输出,但如果遇到比较复杂的XML格式输出,将XSL按照要求依次写下来的话,一是
设计困难,可扩展性差,不利于人员之间的分工协作;另则,可修改性很差,可能会出现
牵一发而动全军的情况,不利于维护。程序中模块化设计逐步细化的方法在这里得到了应
用!
  XSL模板将XSL的设计细化成一个个模板(块),最后再将这些模板(块)组合成一个
完整的XSL;好比船与集装箱,我们不是将所有的货物一件件地堆起来,而是装在各自的集
装箱中,然后再在船上将这些集装箱堆放起来。这种方法可以使你先从整体上考虑整个XSL
的设计,然后将一些表现形式细化成不同的模块,再具体设计这些模块,最后将它们整合
在一起,这样,将宏观与微观结合起来,符合人们条理化、规范化要求。
装集装箱??书写模板(块):<xsl:template>
<xsl:template>
语法:
<xsl:template match="node-context" language="language-name">
属性:
match ── 确定什么样的情况下执行此模板。作为一种简化的说明,在此处使用标记的名
字;其中最上层模板必须将match设为“/”
language ── 确定在此模板中执行什么脚本语言,其取值与HTML中的SCRIPT标记的
LANGUAGE属性的取值相同,缺省值是Jscript
<xsl:template>用match属性从XML选取满足条件的节点,征对这些特定的节点形成一个特
定输出形式的模板。
吊集装箱上船-??调用模板(块):<xsl:apply-templates>
<xsl:apply-templates>
语法:
<xsl:apply-templates select="pattern" order-by="sort-criteria-list">
属性:
select ── 确定在此上下文环境中应执行什么模板,即选取用<xsl:template>标记建立
的模板(块)。
order-by ── 以分号(;)分隔的排序标准,通常是子标记的序列
示例:
  以个人简历为例,为便于处理我们希望“技能”中每一项都用标记对<skill></skill>
括起来,有多少项技能就有多少个这种标记对,经过修改后的个人简历XML文档内容如下:
<?xml version="1.0" encoding="GB2312"?>
<?xml:stylesheet type="text/xsl" href="resume_template.xsl"?>
<document>
<resume>
<name>禹希初</name>
<sex>男</sex>
<birthday>1977.5</birthday>
<skill>数据库设计与维护</skill>
<skill>WEB开发</skill>
</resume>
</document>
  然后,建立一个新XSL文件resume_template.xsl,采用模板的形式,其内容如下:
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<!--根模板-->
<xsl:template match="/">
<HTML><HEAD><TITLE>个人简历</TITLE></HEAD>
<BODY>
<xsl:apply-templates select="document/resume"/>
</BODY>
</HTML>
</xsl:template>
<!--简历模板-->
<xsl:template match="resume">
<TABLE border="1" cellspacing="0">
<CAPTION>个人简历(
<xsl:eval>formatIndex(childNumber(this), "I")</xsl:eval>
)</CAPTION>
<xsl:apply-templates select="name" />
<xsl:apply-templates select="sex" />
<xsl:apply-templates select="birthday" />
<TR/>
<TD>技能</TD><TD COLSPAN="5">
<TABLE cellspacing="0">
<xsl:apply-templates select="skill"/>
</TABLE>
</TD>
</TABLE>
<BR/>
</xsl:template>
<!--姓名模板-->
<xsl:template match="name"><TD>姓名</TD>
<TD><xsl:value-of/></TD>
</xsl:template>
<!--性别模板-->
<xsl:template match="sex"><TD>性别</TD>
<TD><xsl:value-of/></TD>
</xsl:template>
<!--生日模板-->
<xsl:template match="birthday"><TD>生日</TD>
<TD><xsl:value-of/></TD>
</xsl:template>
<!--技能模板-->
<xsl:template match="skill">
<TR><TD><xsl:value-of/></TD></TR>
</xsl:template>
</xsl:stylesheet>
  保存文件,打开文件(个人简历.xml),效果令人满意吧。其实要做到同样的效果,
用前面三周介绍的方法也可做,但你得把它作为一整体考虑。
  在上面的XSL文件中,我们将性别、生日、技能等数据项分别用模板来单独写,再用
<xsl:apply-template>来调用,这样,即使你日后要对这些模板作相应的修改与扩充也很
方便,不致于出现互相干扰、混杂不清的情况。这种从上至下、逐层细化的设计方法,极
大地减少工作复杂程度,也大大减少了差错的产生,可以实现多人的协作设计。
注意:
  如果XML文档中不同标记有同名的子标记,在为其编写模板时,应把父标记作为其前
缀,格式为(parent_mark/child_mark)。
  模板文件必须有一个根模板,其属性match是“/”。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=686879
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
593
import
I
I
回复
0
查看
715
import
I
后退
顶部