admin 管理员组

文章数量: 1086019


2024年4月20日发(作者:css导航条教程)

维普资讯

昆明师范高等专科学校学报 2007,29(4):94—98 

CN 53—1131/G4 lsSN 1O吣-7958 

Journal of Kunming Teachers College 

XSLT应用编程 

王震江,马 宏,俞锐刚,吴绍兵 

(昆明师范高等专科学校计算机系,云南昆明650031) 

摘要:讨论了数据为中心和文本为中心的XML文档的XSLT基本编程技巧,分别是数据显示、条件、循环、求和、 

求平均值、排序、模板调用、项目列表、图形显示等编程问题. 

关键词:XML;XSL;转换;编程技巧 

中图分类号:TP393文献标识码:A文章编号:1008—7958(2007)04—0094一O5 

Applicaton Programming of XSLT 

WANG Zhen-jiang,MA Hong,YU Rui-gang,WU Shao-bing 

(Department of Computer,Kunming Teachers College,Yunnan Kunming 650031,China) 

Abstract:In this paper,discussed in detail XSLT basic programming skills with XMLdocuments of data-centre and 

text-centre,that is prongramming problem of data display,conditional branch,repetition,summing,averaging, 

sorting,template calling,item listing,picture display,respectively. 

K words:XML;XSL;transformation;program techniques 

XML(eXtensibe Markup Language)…文档直接 

在Web浏览器上显示时,将以XML文档各元素节 

点的树型形状显示,这一点与HTML文档的显示不 

样.为了解决XML文档的显示问题,需要借助其 

文档. 

以数据为中心的XML文档可以从表格转换出 

他技术,如CSS,XSLT,DOM,数据岛,SAX等.其中, 

XSL(eXtensible Stylesheet Language,可扩展样式表 

语言)是W3C推荐的XML文档的格式化技术,最早 

于1999年11月提出.经过多次修订,现在使用的是 

XSLT2.0,最新的修订版是2006年6月8号提 

出的 . 

XSL文档本身是一个符合XML语法规范的定 

来.从表1的数据表,可以转换成下页图1的XML 

文档.在这类XML文档中,根元素一般有若干个同 

名的子元素,每个子元素下的数据结构一致,类型一 

样.见图1的根元素goods下有很多个shirt元素。各 

个shit元素都有相同的子元素 r

表1数据表 

义严格的XML文件.在XSL格式化对象中,通过引 

进模板(template)。来访问XML数据元素及其属性, 

结合HTML实现XML文档的转换. 

本文就结构化和非结构化的XML数据的XSL 

转换编程的一些基础问题进行讨论. 

1 X舭文档的类型 

迄今为止,XML数据可以大体分成两类:结构 

化和非结构化.所谓的“结构化”是指具有明显的逻 

辑结构,呈现出有规律的记录型性质。可进行行列划 

分的XML文件,它又称为以数据为中心的XML文 

档.所谓的“非结构化”是指描述一般文章数据的 

XML文档,这些文章主要是字符流,字符与字符之 

间没有明显的逻辑结构信息,小到每个字符,大到一 

个段落,这种数据又称为以文本为中心的XML 

收稿日期:2007—07—19 

以文本为中心的XML文档对应于字符的大量 

集合,具体的XML文档设计依赖文本的内容.下页 

图2所示的是一个一般目录的格式,有一级、二级、 

三级标题.它的一个XML参考文档见下页图3所 

示.在这个XML文档中,为了分别表示不同层次的 

原文数据,用contents作为目录的根元素,chapter表 

示章,section表示节,subsection表示小节.为了表示 

的方便,还给chapter,section设置了属性nanle. 

不同类型的文档有不同的转换方法,下面分别 

来讨论这两类XML文档的XSLT(XSL Transforma. 

tion)编程问题. 

作者简介:王震江(1957一),男,河北故城人,副教授,硕士,主要从事计算机网络及其应用,数据库及其应用研究; 

马宏(1979一),男,云南昆明人,助教,主要从事电子商务及网络安全研究. 

维普资讯

第4期 王震江,马宏。等:XSLT应用编程 95 

图1转换的XML文档 

图4 XSLT程序基本框架 

用于确定转换从哪个元素开始,name用于对该模板 

命名.一个模板必须具有一个match或name属性, 

或两者都有.如果带有match属性,它就是一个模版 

规则.如果带有name属性,它就是命名模版.<xsl: 

template>和</xsl:template>必须配对. 

图4框架中的<html></html>之间的内容是 

HTML元素.在一个具体实施转换的程序中,一定有 

个HTML文件的外壳,然后把具体的XSL指令与 

HTML结合起来实现转换. 

<html></html>中虚线的部分就是本文将 

详细讨论的XSLT程序的主体. 

所有的XSLT程序都必须包含在这个表单框 

架中. 

2.2 XSLT程序指令 

为了方便说明。这里的讨论以图1和图3的 

XML为例进行.在需要其他XML文档时,会作相应 

的增加. 

2.2.1显示元素和属性值 

图3 XML参考文档 

XSLT中用<xsl:value—of select=expression>… 

</xsl:value—of>来显示元素和属性值.对于图1中 

2以数据为中心的XML文档转换 

shirt下的子元素可以用如下的形式进行值转换: 

<xsl:value—of select=”naine”/> 

在XSLT 2.0规范中,主要涉及XML数据的表示、 

<xsl:value—ofselect=”material”/> 

条件、循环、求和、求平均值、排序、模板调用等方面.本 

<xsl:value一 select=”size”/> 

文讨论的所有内容均属于XSLT 2.0规定的内容. 

<xsl:value—ofselect=”price”/> 

2.1 XSLT基本框架 

其中,select属性的取值是需要转换的元素名称. 

对于属性值。可以在属性名的前边加上“@”符 

个XSLT程序的基本框架见图4所示. 

号。如对图3的chapter元素中的id进行转换时,可 

个XSLT文档本身是一个符合XML语法规 

范的定义严格的XML文件。所以必须有第一行. 

以写成: 

<xsl:stylesheet>称为表单元素,图4的第二行 

<xsl:value—ofselect=“@id”/> 

是开始标记,最后一行是结束标记,这表明表单从第 

2.2.2 组织循环 

二行开始到最后一行结束.在<xsl:stylesheet>元素 

如果在图4的程序中仅写入一组<xsl:value— 

中包含版本(version)和XSL的名称空间(xmlns: 

of select=expression>语句,只能给出第一个shirt 

xs1)声明.因为是XSLT 2.0,所以version=“2.0”. 

元素的值,要显示全部的shitr元素,可以使用循环 

而http://www.w3.org/1 999/XSL/Transfol'In是XSLT 

语句.XSLT的循环语句用<xsl:for—each select= 

的默认名称空间,由系统规定. 

expression></xsl:ofr—each>,其用法如下: 

<xsl:template>用来访问XML数据元素及其 

<xsl:value—of select=”goods/shi ̄”> 

<xsl:value—of select=”naine”/> 

属性,称为模板(template),所有的XML数据都可以 

<xsl:value一0f select=”materila”/> 

通过模板来加载.一个表单(stylesheet)下可以有一 

<xsl:value—of eslect=”siez”/> 

个模板,也可以有两个以上的模板.当出现两个以上 

<xsl:value—ofselect=”price’’/> 

的模板时。模板之间一般存在调用关系.图4中给出 

</xsl:value—of> 

了两个模板.<xsl:template>元素中的match属性 其中,select=”goods/shitr”称为XPath表达式,它表 

维普资讯

昆明师范高等专科学校学报 2007年12月 

示根元素goods下所有的shirt元素的子元素参与循 

环,这样就可以显示全部的shitr的子元素. 

2.2.3 分支语句 

如果要根据具体的元素值来选择不同的显示策 

略,就需要对元素值进行选择,这种选择用分支语句 

来实现.分支语句分为单分支、多分支两种. 

1)单分支指令为 

<xsl:if test=expression>…・・・</xsl:if> 

其中test=expression是分支语句的测试条件,当条 

件为真时,执行<xsl:if></xsl:if>中的语句,否则 

跳过此语句.如要实现每隔一行显示兰色的背景,可 

以通过修改HTML中的<tr>元素的背景属性来实 

现.如: 

<tr> 

<xal:iftest=”position()mod 2=0”> 

<xsl:attribute name=”bgeolor”>blue</xsl:attirbute> 

</xsl:if> 

</tr> 

其中的test=”position()mod 2=0”表示行位置为 

偶数,mod和position()分别是XPath的模运算和表 

示在根元素下第几个子元素的位置的函数.该分支 

语句通过<xsl:attribute>元素中name=”bgcolor” 

来修改HTML的<tr>元素背景(bgcolor)实现行背 

景颜色的改变,凡是偶数行的背景被设置成兰色. 

2)多分支语句为 

多分支用一对<xsl:choose></xsl:choose>元 

素来控制,该元素中的多个<xsl:when>表示多个 

可能的取值,其测试条件用test属性来设置,用法与 

xsl:if中的test属性一样.如果各个<xsl:when>都 

不满足,则执行<xsl:otherwise>,这种语句结构在 

各种高级语言中常见. 

<xsl:choose> 

<xsl:when test expression>……</xsl:when> 

<xal:when tset=expression>……</xsl:when> 

<xsl:otherwise>……</xsl:o ̄erwise> 

</xsl:choose> 

这个结构既可以实现双分支,也可实现多分支. 

如要实现偶数行背景为兰色,奇数行为邮政绿 

色,这是一个双分支结构,程序为: 

<tr> 

<xsl:choose> 

< ̄l:when test=”position()mod 2=0”> 

<xsl:attribute name=”bgeolor”>blue</xsl:attirbute> 

</xsl:when> 

<xsl:otherwise> 

<xsl:attribute name=”bgcolor”>teal</xsl:attribute> 

</xsl:otherwise> 

</xsl:choose> 

</tr> ・ 

此程序仍然通过修改HMTL的<tr>元素的背景色 

来实现奇偶行不同颜色的显示. 

如果想根据元素的值来确定背景的颜色,用该 

元素作为测试条件即可.如根据图1的价格用不同 

的颜色显示背景,小于100的用绿色,100~199的 

用邮政绿,200~299的用褐红色,300~399的用橄 

榄色,高于400元的用红色.程序中还是要修改 

<tr>元素的背景色.如: 

<tr> 

<xsl:attirbute nanle=”bgeolor”> 

<xsl:choose> 

<xsl:when test=”price<100”> een</xal:when> 

<xsl:when test=”price&lt:200”>teal</xsl:when> 

<xsl:whentest=”price&lt:300”>maroon</xal:when> 

<xsl:when test=”price&lt:4OO”>olive</xsl:when> 

<xsl:otherwise>red</xsl:otherwise> 

</xsl:choose> 

</xsl:attribute> 

</tr> 

该程序中使用了比较运算符“<”,它是小于 

符号(<)的实体引用.因为XML 1.0规范规定:当 

XML文档中需要表示“<、>、’、”、&”这5个符号 

时,需要用实体引用,否则将引起致命错误,这5个 

符号叫做系统实体,这与高级语言中的保留字类似. 

XPath给出的比较运算是:等于(=)、不等于 

(!=)、小于(<)、小于等于(<=)、大于(>)、大 

于等于(>=). 

如果要根据某个元素的具体值设置文字显示的 

颜色而不是背景色时,应该怎么办?这时需要对文 

字颜色color进行重新设置.要修改color的值,需要 

结合CSS(Cascading Style Sheet),用HTML的头元 

素style来实现修改. 

如设置英语成绩小于60分的用红色来显示,语 

句设计为: 

<xsl:attirbute nanle=”style”>color: 

<xsl:iftest=”english&lt:60”>red</xal:if> 

</xsl:attribute> 

<xsl:value—of select=”english”/> 

其中,使用<xsl:attribute>的name=”style”来确定要 

修改的是HTML的头元素style,并用style来修改color 

的值.熟悉HTML编程的读者都知道style元素的用法, 

它出现在<head></head>中,用于对HTML中元素 

的各种样式进行修改.<xsl:if>给出英语成绩小于60 

分的用红色(red)来重置color的值. 

2.2.4 算术运算 

进行算术运算是编程语言的基本功能,XSLT同 

样具有这样的功能.算术运算包括:加(+)、减 

(一)、乘( )、除(div)、模运算(mod).求和与求平 

均是g-见的算术运算. 

1)求和 

对于学生成绩表这样的数据,有时需要对学生 

某个学期的成绩求和.求和有几种方式,水平方向的 

求和和竖直方向的求和方法是不一样的.如对于 

表2的成绩表(下页图5是该表的XML文档片段), 

水平方向求和可以得到某学生的总成绩,而进行竖 

直方向的求和得到的是所有学生的某门课程的成绩 

总和,各有不同的意义,因而求和方法也不相同. 

表2学生成绩表 

水平求和,可以用: 

<xsl:value—of select=”english+chinese+math”/> 

维普资讯

第4期 王震江,马宏,等:XSLT应用编程 

</xsl:template> 

如果想显示shirt下的所有子元素,可以在第一个模板 

中加上选择其他元素的<xsl:apply—templates>语句, 

然后在第2个模板后增加相应的三个模板,它们的 

match属性分别写成”material”,”size”,” ce”即可. 

2.2.7 有参数多模板调用 

如果要求对表1的商品分成高于200元和小于 

200元进行分组显示(见图6),则需要带参数的多 

模板调用才能实现.这是一个稍微复杂一些的XSLT 

程序,下面来讨论. 

商晶信息(超过200元的衬衫) 

图5 XML文档片段 

这个结果可以填写到表2的合计列. 

竖直求和用函数sum()进行,对所有学生的英 

语进行求和,用语句: 

<xsl:value—of select=”sum(//english、”/> 

其中,“//english”表示从根元素开始的任意层次的所 

有english元素.“//”是一个XPath的路径表达式. 

2)求平均 

XSLT2.0提供avg()函数来求平均值.如对所 

有英语成绩求平均,用法为: 

<xsl:value—of select=”avg(//english)”/> 

商品詹患(200元以下的衬衫) 

早期的XSL不支持对相同元素的值直接求平 

图6商品分组显示 

均值,如果你的计算机还不能支持XSLT2.0,可以用 

下列方法求平均: 

<xsl:value—of select=”sum(//english1 div count(//english)”/> 

用所有的英语成绩的和(sum(//english))除以 

(div)英语成绩的个数(count(//english)),同样可 

以实现求平均.XSLT 1.0提供了sum()和count() 

函数,用于求和与计数. 

2.2.5 排序 

1)定义参数 

定义参数使用<xsl:param name=””select 

””></xsl:param>,其中属性name定义参数名 

称,select的含义和用法同前.如定义参数名为cata. 

1og,并匹配到所有的shit子元素,r语句为: 

<xsl:param name=”catalog”select=”goods/shirt”/> 

根据某种需要,对一列数据进行“从小到大”或 

“从大到小”的排序是常见操作.XSLT提供的<xsl: 

sort select=expression>元素可以实现对某个元素 

值的排序.其中的select属性的用法与前面讨论过 

的<xsl:value—of>元素的select一样.在表1的表 

2)传递参数 

参数传递时使用<xsl:with—param name=”” 

select:””></xsl:with—param>元素,其中name 

属性是必须的.这个命令可以在xsl:call—template, 

xsl:apply—templates中使用. 

3)调用模板 

在参数调用时还需要使用调用模板<xsl:call 

格中根据价格进行从小到大排序的语句为: 

<xsl:sort select=”price”order=’’ascending’’/> 

template name:””></xsl:call—template>元 

其中,select=”price”表示排序的元素是price,order 

素,其中name属性用于指定一个现成的命名模板, 

”ascending”表示排序按照升序排列,如果期望排 

序按从大到小顺序,则选择order=”descending”. 

2.2.6 无参数多模板调用 

多模板调用有无参数和有参数调用两种.根据 

来调用该模板.命名模板的概念在前面已经提到. 

如调用一个名称为catlog的命名模板,其中定义 a

了传递list参数的为小于2OO元的调用模板设计成: 

<xsl:call—template name=’’catalog”> 

<xsl:with—paramllalne=’’list”select=”goods/shitr 

实际需求,要表示的数据会具有比较复杂的表现形 

式,这时就可能用到多模板调用. 

[price&It;200.0o /> </xsl:call—template> 

除了上面讨论过的<xsl:value—of>元素外, 

XSLT还提供了应用模板<xsl:apply—templates>元 

素来显示XML数据,其格式为:<xsl:apply—tem— 

plates select=expression>…</xsl:apply~templates 

这样就可以调用一个现成的名字为catlog命名 a

模板. 

4)命名模板 

>.下面的两个模板中第1个xsl:template通过xsl: 

apply—templates的select筛选出name子元素,第2 

个并行的xsl:template结构中直接使用<xsl:apply 

templates/>来显示name元素值. 

在参数调用中需要调用一个现成的catalog命 

名模板,所以在XSLT程序中需要定义一个名为cat. 

alog的命名模板,这个命名模板内部完成两件事:第 

个用<xsl:param>定义参数list,第二个任务是实 

现数据转换.该模板设计如下: 

<xsl:template nalxle:’’catlog”> a

<xsl:param name=”list”select=”goods/shit”/> r

<xsl:template match=”shit”> r

<P><xsl:apply—tempiates select=”name”/></p> 

</xsl:template> 

<xsl:template match:”name”> 

<xsl:apply—templates/> 

<xsl:for—each select=”¥list”> 

</xsl:for—each> 

</xsl:template> 

维普资讯

98 昆明师范高等专科学校学报 2007年l2月 

在<xsl:template>中使用了属性name,所以称为命 

名模板.该模板的省略部分是实现元素数据转换的 

语句. 

这样,通过参数定义、参数传递和模板调用可以 

实现分类显示XML数据. 

3以文本为中心的XML文档转换 

3.1普通文本的处理 

这里所指的普通文本是以大段大段的文字为主 

的XML文档.图7是这类文本的一个样本.这类文 

本是今天任何网站发布信息的最普遍形式,所以对 

这类文本的处理是XML必须面对的重要任务.图7 

对应的XML文档可以设计一个根元素text。然后所 

有的段落设计成名称相同的子元素paragraph.对这 

样的XML文档进行转换,可以用上节讨论的内容实 

现,方法简单. 

J。。_-。。。。。。。。。 -。-●。●。。。。。。 。。 _-___-●--。。。●。。_^__-。-。。。。。。。。'●●●__。。。。。。。。。。。‘+’。。。。。。。。。。。。-。 。。。。。。。。。。。。。 。。。。。。。。。。。。 。。。。。。。。。。。‘’h。’。。 。。。。。。。。 — 。 。。。。。。。。。 — —’。。。一 

I W3C在推出XML 1.0规范后,便开始开发符合XML规范要求 

I的转换技术,这就是XSL.1999年l1月l6日,W3C发布了XSLT 

I的第一个版本,称为XSLT1.0.在2001年l2月20日发布了第二版, 

J之后相继推出7J/' ̄订版.最近的一个是2005年2月l1日发布的. 

1 xSL包含两个部分:一个是XSLT(XSL Transformation),另 

『一个是定义格式的XML词表.XSL定义一个XML文档的样式,这 

1个定义用XSLT描写XML文档是如何转换成另一个使用格式化词表 

f的XML文档的. 

I XMLT2.O规范包含:样式表结构,数据模型,XSLT语言,模 

I式,模版规则……等内容. 

图7普通文本 

3.2文本的简单列表转换 

对于存在列表项的文本,如前文中的2.2.1~ 

2.2.7的文本列表(见图8),如何处理这种这类文 

本,在转换时把这些带括号数字的内容自动显示出 

来?这也是XSLT中要解决的问题. 

(1)显示元素和属性值 

(2)组织循环 

(3)分支语句 

(4)算术运算 

(5)排序 

(6)无参数多模板调用 

(7)有参数多模板调用 

图8文本列表 

为了进行列表项转换,XSLT中提供了<xsl: 

number/>元素,其中包括value,select,level,count, 

format等属性,format属性用于提供列表符的格式 

(有l,2,3…,a,b,c…,I,II,III…).对于列表项的转 

换,图8的形式已经是最简单的,可以在XSLT程序 

中简单实现.number元素的形式设计成: 

<xsl:number value=”position()”format=”(1)”/> 

其中,使用value属性给出每个元素的位置position 

(),format给出每个位置上列表项形式为2.2.1,并 

且计数从1开始,这样就可以实现图8的列表转换. 

3.3文本的复杂列表转换 

如果要给图3的XML进行转换,<xsl:number/"> 

元素中的很多属性都要用到,给章计数的XSLT程序段 

设计为一个模板,这个模板使用<xsl:number/>中的 

level,count。format三 属性. 

第<xsl:number level=”multiple”count=”chapter  Isection  I

subsection”format= 1’/>童 

其中,level有三个取值:single,any,multiple,只需显 

示第一级目录的编号时取single;所有的级别从第一 

个项目开始顺序编号,不分级别时取肌Y;对多级目 

录分级分层次编号时取multiple.count用来指定参 

与计数的元素个数.对于图3,元素是chapter/see— 

tion/subsection,要对所有级别的元素都计数,count 

要设计成等于”chapter l section l subsection”.format 

给出了第一级列表的数字样式. 

类似地,给节section设计的<xsl:number/>为: 

<xsl:nutbuerlevel:”multiple”count:”chapterI sectionI 

subsection”format=”1.1”/> 

给小节subsection设计的<xsl:number/>为: 

<xsl!number level=”multiple”count=”chapterI section I 

subsection”format=’’1.1.1”/> 

注意三个层次的<xsl:number/>中仅仅format 

的格式不一样。其余的都一样. 

通过这个示例,解决了实际文本中复杂列表项 

自动计数的问题L]J,这是XSLT2.0的优势,这种形 

式在Web应用中也时极其常见的. 

4图形显示 

图形处理是Web信息中的一个大类,XML中如 

何处理图形文件?如果一个产品信息不仅需要文字 

描述外,还需要图形来说明时,XML技术中采用把 

图形文件存放在一个文件夹下,然后在关于该产品 

的XML文档中专门设置一个元素或属性来存放该 

产品图形的URL,在XSLT程序中通过<xsl:attrlb— 

ute>修改<img>元素的sre属性来实现图形的显 

示.形式如: 

<xsl:apply—templates/> 

<xsl:iftest=”picture“> 

<img> 

<xsl:attribute name=”src”><xsl:value—ofselect 

=”picture”/></xsl:attribute> 

</img> 

</xsl:if> 

其中,XML文档中该产品的图形元素为picture,在 

显示该产品的信息时(<xsl:apply—templates/>), 

使用<xsl:if>来检查该元素是否是picture元素,如 

果是,修改img的src属性,从而实现转换.否则跳过 

<xsl:if>不显示图形. 

通过XSLT编程,可以方便地操作XML文档, 

这在XML转换应用编程中是一个基础问题.笔者通 

过对XSLT 2.0的研究,对XSLT编程进行了深入仔 

细的实践. 

[参考文献] 

BRAY T.Extensible Markup language(XML)1.0(Third 

edition)[EB/OL].[2004—02—04].http://www.w3. 

org/TR/2004/REC- ̄-20040204. 

[2] 

MICHAEL KAY.SAXONICA.XSL Transformations 

(XSLT)Version 2.0[EB/OL].[2006—06—08].ht. 

tp://www.w3.or#TP,J20o5/WD.xslt20-20060608. 

[3] 

王震江.XML程序设计[M].北京:中国铁道出版社, 

20o6:175—177. 


本文标签: 元素 模板 显示 数据