430 likes | 613 Views
第5章 XLS. 5.1 XSL 简介 5.2 XSL 基本语法 5.3 XSL 节点选择 5.4 XSL 控制指令. 5.1 XLS 简介. XLS: 可扩展样式语言 eXtensible StyleSheet Language。XSL 最近的一个草案于2000年3月提出,仍然有待进一步修改完善。 XSL 特点: 遵守 XML 的语法规则, XSL 本身就是一个 XML 文档,系统可以使用同一个 XML 解释器对 XML 文档及其相关的 XSL 文档进行解释处理。. 5.1 XLS 简介. XSL 组成:
E N D
第5章 XLS 5.1 XSL简介 5.2 XSL基本语法 5.3 XSL节点选择 5.4 XSL控制指令
5.1 XLS简介 • XLS:可扩展样式语言eXtensible StyleSheet Language。XSL最近的一个草案于2000年3月提出,仍然有待进一步修改完善。 • XSL特点:遵守XML的语法规则,XSL本身就是一个XML文档,系统可以使用同一个XML解释器对XML文档及其相关的XSL文档进行解释处理。
5.1 XLS简介 • XSL组成: • 数据转换语言XSLT(XSL Transformations):描述了如何将一个XML文档进行转换,转换为可浏览或可输出的格式;目前主要转换成HTML文档。 • 数据格式化语言XSL-FO(XSL Formatting Object):定义了格式对象FO(fomatted object),作用类似CSS。但目前争论颇多,成了XSL标准中的老大难问题,所以很少使用。
5.1 XLS简介 • XSLT作用:通过定义转换模板XLST文档,将XML文档转换为HTML文档显示。 XML文档+XLST文档 HTML文档 • XML文档结构树:将XML文档看作一个文档结构树,根节点代表整个文档,处理指令、注释和各个元素都是结构树的一个节点。根元素之下的各层次子元素构成一系列的子节点。注意根元素不是树的根节点。 • XSLT转换原理:将XML文档结构树转换为一个有样式信息的HTML结果树。在XSLT文档中定义了与XML文档中各个逻辑成分相匹配的模板,以及匹配转换方式。
5.1 XLS简介 • XSL文档的格式: <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <xsl:template match="…"> <xsl:apply-templates select="…" /> <xsl:value-of select="…" /> </xsl:template> … … </xsl:template> </xsl:stylesheet>
5.1 XLS简介 • 说明: • XSL文档是XML文档,故第一行必须是XML声明语句。大小写敏感 。 • 第二行是XSL声明语句,注意所使用的名称空间。 • 主要内容是一个或多个模板 <xsl:template match=…>…</xsl:template> • 在XSL文档中使用HTML标记,用于指明如何将XML转换成HTML。注意区分大小写,HTML的空标记,比如<br><hr>必须写成<br/><hr/> • 在XSL文档中可以通过使用HTML使用CSS
5.1 XLS简介 • 名称空间说明:有两种。用第一种较好。注意大小写不能错! • <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> 和 • <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/REC-html40">
5.1 XLS简介 • XML引用XSL:类似引用CSS,在XML文档中使用引用指令: <?xml version="1.0" encoding="GB2312" ?> <?xml:stylesheet type="text/xsl" href="文件名.xsl"?> 或 <?xml-stylesheet type="text/xsl" href="文件名.xsl"?>
5.2 XSL基本语法 • XSL模板: XSL文档的内容是一个或多个模板指令,每个模板与文档树的指定元素节点匹配,指定元素节点显示的样式。一个XSL文档至少包含一个与根节点匹配的模板。 • XSL指令: <xsl:template match="…">…</xsl:template> <xsl:apply-templates select="…" /> <xsl:value-of select="…" />
5.2.1 XSL模板定义指令 • XSL模板指令:表示与文档树的指定元素节点匹配,指定匹配后所使用的显示样式。 <xsl:template match="元素名"> … …显示样式 </xsl:template> • XSL模板指令:表示与文档树的根节点匹配 <xsl:template match="/"> … …显示样式 </xsl:template>
5.2.1 XSL模板定义指令 • XSL模板指令:表示与文档树的未指定匹配样式的节点匹配 <xsl:template match="*"> … …显示样式 </xsl:template> • 理解<xsl:template match=…>作用:相当于编程中定义一个函数,并没有调用。但是<xsl:template match="/">是主程序,自动调用。
5.2.2 XSL模板调用指令 • XSL模板调用指令: <xsl:apply-templates select="元素名" /> • 位置:出现在 <xsl:template match=…>…</xsl:template>中间 • 作用:在当前位置,使用指定的模板产生HTML代码。相当于编程中调用已经定义的一个函数。
5.2.3 XSL选取值输出指令 • XSL选取值输出指令: <xsl:value-of select="元素名" /> • 位置:出现在 <xsl:template match=…>…</xsl:template>中间 • 作用:在当前位置,取出指定元素的值。
5.2.4 简单实例 • XML文档:Students.xml <?xml version="1.0" encoding="gb2312" ?> <?xml-stylesheet type="text/xsl" href="Students.xsl"?> <roster> 学生花名册 <student class= "金融" > <name>李华</name> <origin>河北</origin> <age>15</age> <telephone>62875555</telephone> </student>
5.2.4 简单实例 • XML文档:Students.xml续 <student class= "保险" > <name>张三</name> <origin>北京</origin> <age>14</age> <telephone>82873425</telephone> </student> </roster>
5.2.4 简单实例 • XSL文档:Students.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="roster"/> </BODY> </HTML> </xsl:template>
5.2.4 简单实例 • XSL文档:Students.xsl续1 <xsl:template match="roster"> <TABLE BORDER="1"> <CAPTION>学生花名册</CAPTION> <TR> <TH>姓名</TH> <TH>籍贯</TH> <TH>年龄</TH> <TH>电话</TH> </TR> <xsl:apply-templates select="student"/> </TABLE> </xsl:template>
5.2.4 简单实例 • XSL文档:Students.xsl续2 <xsl:template match="student"> <TR> <TD><xsl:value-of select="name"/></TD> <TD><xsl:value-of select="origin"/></TD> <TD><xsl:value-of select="age"/></TD> <TD><xsl:value-of select = "telephone"/></TD> </TR> </xsl:template> </xsl:stylesheet>
5.2.4 简单实例 • 运行效果:双击Students.xml
5.2.4 简单实例 • Students.xsl转换对应关系图:
5.2.4 简单实例 • XSL文档:Students.xsl,另一种格式,不同的模板设计,导致同一个文档不同的输出效果。 <?xml version="1.0" encoding="gb2312" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
5.2.4 简单实例 • XSL文档:Students.xsl续1,另一种格式 <xsl:template match="/"> <HTML> <HEAD> <TITLE>学生花名册</TITLE> </HEAD> <BODY> <xsl:apply-templates select="roster"/> </BODY> </HTML> </xsl:template> <xsl:template match="roster"> <H2>学生花名册</H2> <HR/> <xsl:apply-templates select="student"/> </xsl:template>
5.2.4 简单实例 • XSL文档:Students.xsl续2,另一种格式 <xsl:template match="student"> <b><xsl:value-of select="name"/></b> <xsl:value-of select="age"/> <i><xsl:value-of select="origin"/></i> <xsl:value-of select = "telephone"/> <HR/> </xsl:template> </xsl:stylesheet>
5.2.4 简单实例 • 运行效果:双击Students.xml
5.2.4 简单实例 • 使用@属性名:注意在前面的简单实例中没有显示班级数属性,现在在适当地方加上如下语句 <xsl:value-of select = "@class"/> • 效果如下:
5.2.4 简单实例 • XML文档:Students_sex.xml修改.在name元素中增加sex属性 <?xml version="1.0" encoding="gb2312" ?> <?xml-stylesheet type="text/xsl" href="Students.xsl"?> <roster> 学生花名册 <student class= "金融" > <name sex= "女" >李华</name> <origin>河北</origin> <age>15</age> <telephone>62875555</telephone> </student>
5.2.4 简单实例 • XML文档:Students_sex.xml续 <student class= "保险" > <name sex= "男">张三</name> <origin>北京</origin> <age>14</age> <telephone>82873425</telephone> </student> </roster>
5.2.4 简单实例 Xsl读取sex的语句: <xsl:value-of select="name/@sex"/>。
5.3 XSL节点选择 • 匹配的重要性:在利用XSL进行转换的过程中,匹配非常重要。在模板声明语句<xsl:template match="">和模板应用语句<xsl:apply-templates select="">中,用引号括起来的部分的目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素。
5.3.1 XSL节点匹配 • 使用元素名匹配节点: <xsl:template match="student"> • 根节点匹配符:/ <xsl:template match="/"> • 根元素匹配符:/* <xsl:template match="/*"> • 当前节点匹配符:一个点 . <xsl:template match= "."> • 父节点匹配符:两个点 .. <xsl:template match= "..">
5.3.1 XSL节点匹配 • 在match中使用路径: <xsl:template match="/roster/student/name"> • 如果roster是当前路径: <xsl:template match="student/name"> • 在select中使用路径: <xsl:apply-template select="/roster/student/name"> • 如果roster是当前路径: <xsl:apply-template select="../student/name">
5.3.1 XSL节点匹配 • 特殊路径符号*:表示任意节点 <xsl:apply-template select="roster/*/name"> • 特殊路径符号//:表示任意多层节点 <xsl:apply-template select="//name">
5.3.1 XSL节点匹配 • 附加子元素条件选择节点:选择具有name子元素的student元素 <xsl:apply-template select= "student[name]"> • 附加指定字符串条件选择节点:选择具有age子元素内容为"14"的student元素 <xsl:template match= "student[age='14']">
5.3.1 XSL节点匹配 • 附加属性条件选择节点:选择具有class属性的student元素 <xsl:apply-template select= "student[@class]"> • 附加指定属性条件选择节点:选择具有age子元素内容为"14"的student元素 <xsl:template match= "student[@class='金融']">
5.4 XSL控制指令 • 控制指令:在XSL模板中使用,功能类似C语言的if、switch、for语句。 • 简单条件标记指令:<xsl:if>,注意没有else • 多条件标记指令:<xsl:choose> • 循环处理标记指令:<xsl:for-each>
5.4.1 XSL判断指令 • 判断指令1:以元素名为条件 <xsl:if match="元素名称">… </xsl:if> • 判断指令2:以元素内容为条件 <xsl:if test="元素名称[.='元素内容']''>…</xsl:if> • 判断指令3:以元素属性为条件 <xsl:if match=".[@属性名称='属性值']">…</xsl:if> 或 <xsl:if test=".[@属性名称='属性值']">…</xsl:if>
5.4.1 XSL判断指令 例子: <xsl:if match= "name">...</xsl:if> <xsl:if test= "name[.='张三']">...</xsl:if> <xsl:if test= "age[.> '15']'">...</xsl:if> <xsl:if test= "age[.> ='15']'">...</xsl:if> <xsl:if test= "age[.< '15']'">...</xsl:if> <xsl:if test= "age[.<='15']'">...</xsl:if> <xsl:if test= ".[@class='保险']">...</xsl:if> <xsl:if match= ".[@class='保险']">...</xsl:if> 问题:不等于怎么写?
5.4.2 XSL多条件判断指令 • 语法:test的写法与<xsl:if test=>一样 <xsl:choose> <xsl:when test="…"> … </xsl:when> … <xsl:otherwise> … </xsl:otherwise> </xsl:choose>
5.4.3 XSL循环指令 语法: <xsl:for-each select="…" order-by="…"> <xsl:value-of …/> … </xsl:for-each> 例子: students.xml, students3.xsl或p143 select="XML文件中标记名" 排序:order-by="+sex;-score"表示按sex升序、score降序排序。
5.4.4 XSL排序指令 • 排序指令:xsl:sort对于用xsl:for-each或xsl:apply-templates匹配的节点,可使用xsl:sort将所选节点内容进行排序,如: • 排序指令1:以id为关键字按大写优先排序 <xsl:sort case-order="upper-first" select="@id"/> • 排序指令2:以id为关键字按小写优先排序 <xsl:sort case-order="lower-first" select="@id"/>
5.4.4 XSL排序指令 • 排序指令3:以id为关键字按字母升序排序 <xsl:sort order="ascending" select="@id "/> • 排序指令4:以id为关键字按字母降序排序 <xsl:sort order="descending" select="@id "/>
5.4.4 XSL排序指令 • 排序指令5:以id为关键字按文本类型排序,如对于一组id数据101,2,44,305来说,排序结果是101,2,305,44 <xsl:sort data-type="text" select="@id"/> • 排序指令6:以id为关键字按数据类型排序,上面一组数据的排序结果是2,44,101,305 <xsl:sort data-type="number" select="@id"/>
5.4.5 XSL指令实例 例子说明:students_sex.xml, students3.xsl。注意其中的<!--定义模板-->、 <!--调用模板-->、 <!--循环指令-->、<!--排序指令-->、<!--多条件选择指令-->、<!--读取属性指令-->、<!--读取子元素指令-->、<!--读取子元素属性指令-->