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.
版权声明:本文标题:XSLT应用编程 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1713570353a641262.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论