CSS与XSLT

CSS

CSS(层叠样式表)是W3C制定的网页样式标准,以弥补HTML语言在表现能力上的不足。现在使用的是CSS level 2,于1998年5月发布。
XML支持CSS,以实现数据的显示控制。使用CSS可获得以下优势:
数据重用:一个CSS可应用于多个XML文档
增强表现力:利用CSS可以修饰数据的显示
增加数据定位:可以控制数据的显示位置
CSS样式规则
选择符 { 属性 : 属性值 ; [属性 : 属性值 ; ……] }
 例如:   student{ font-family: 宋体; }
选择符:表示受样式声明约束的一个或多个元素
多个选择符:  cell1,cell2
子选择符: class > student
子孙选择符: class name
相邻兄弟:cell1+cell2(二者必须同时、顺序、连续出现)
属性:受约束的选择符的样式属性
属性值:属性的取值
样式是继承的,即在某元素上定义的样式将直接传递给其子孙元素

<!--嵌入式CSS-->
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet type="text/css"?>
<student xmlns:html="http://www.w3c.org/Profiles/XHTML-transitional">
	<html:style>
		student{display:block;background-color:blue;}
		name{display:line;font-size:12pt;color:red;}
		age{font-size:20pt;color:yellow;}
	</html:style>
	<name>张三</name>
	<age>20</age>
	<name>李四</name>
	<age>21</age>
</student>
/**独立的CSSCSS文档stud.css**/
student{ display:block; background-color:blue; }
name{ display:line; font-size:12pt; color:red; }
age{ font-size:20pt; color:yellow; }
<!--XML文档-->
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet href=“stud.css" type="text/css"?>
<student>
	<name>张三</name>
	<age>20</age>
	<name>李四</name>
	<age>21</age>
</student>
XSLT概述

XSL(eXtensible Stylesheet Language,可扩充样式表语言)是针对XML提出的,比CSS更为有效。XSL是用XML定义的,为XML的样式显示设计的。XSL文档是格式良好的。利用XSL,可以将XML转化为HTML,可以过滤或分类XML数据,可以对XML文档的片断进行寻址,可以基于数据值来格式化XML数据,也可以向不同设备输出XML数据。
XSL包含3部分:
  XSLT(Transformation):定义转化XML的方法
  XPath:定位XML数据的方法,已发展为查询语言
  XSL-FO(Formatting Object):格式化XML的方法,如转化为PDF
XSL用途是XML->XML,其实XSL和XHTML都是XML

XSLT处理器

例如:

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions">
	<xsl:template match="/班级">
		<html>
			<body>
				<table border="1" >
					<tbody>
						<tr bgcolor="green">
							<th>姓名</th>
							<th>年龄</th>
						</tr>
						<tr>
							<td>
								<xsl:value-of select="学生/姓名"/>
							</td>
							<td>
								<xsl:value-of select="学生/年龄"/>
							</td>
						</tr>
					</tbody>
				</table>
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet href="std1.xsl" type="text/xsl"?>
<班级>
	<学生>
		<姓名>张三</姓名>
		<年龄>21</年龄>
	</学生>
	<学生>
		<姓名>李四</姓名>
		<年龄>20</年龄>
	</学生>
</班级>

XSLT的stylesheet元素

stylesheet元素是XSLT文档的根元素,语法为:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
 <xsl:tempate match="/">
 ……
 </xsl:template>
</xsl:stylesheet>

这里分别声明使用了W3C的xslt、fo、schema、xpath等名称空间

XSLT模板

XSLT将XML文档看作一个对象,可以用树结构表示,XML的根元素对应根节点,各子元素分别对应树的节点。
XSLT处理器从XML文档树中查找指定的节点(元素),找到后,再从XSLT文档中找到与该节点匹配的样式定义(模板),按指定的样式显示数据。
XSLT模板可以是HTML或CSS
XSLT模板是XSLT最重要的概念。XSLT模板用template元素声明,包含一系列XSL指令,控制XSLT转换流程并指定XSLT转换的输出内容
XSLT模板有两种:
模板规则(Template Rule):匹配并处理指定的XML节点。必须有match属性,属性值为XPath表达式,指明该模板可匹配哪些XML节点
具名模板(Named Template):可被call-template元素反复调用,处理当前的XML上下文内容。必须有name属性,以便调用
初始上下文节点和初始模板
XSLT转换从初始上下文节点(Initial Context Node)开始,XSLT处理器调用与该节点匹配的模板,按该模板的内容执行转换
初始上下文节点是XSLT转换开始时在XML文档中定位的节点。如果将XML文档直接传入XSLT处理器,初始节点就是XML文档的根节点。如果是从XML文档的某个节点传入的,那么该节点就是初始节点
初始模板(Initial Template)是和XSLT初始节点匹配的XSLT模板。一般地,初始节点是根节点,初始模板由属性match=“/”的template元素指定。如果初始节点元素为“我的文档”,则初始模板的属性match=“我的文档”
如果没有与初始节点匹配的模板,XSLT处理器默认执行一个<xsl:apply-templates/>操作,匹配所有子节点
xml中根节点为/
<xsl:value-of select="*/name"/>用于读取元素中包含的文字内容,或是某个属性的值,注意别遗忘了最后的斜杠,*为通配符,代表当前节点下的所有的节点,/为下一级

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions">
	<xsl:template match="/">
		<xsl:call-template name="PrintCurrentNode"/>
		<xsl:apply-templates select="我的文档"/>
	</xsl:template>
	<xsl:template match="我的文档">
		<xsl:apply-templates select="标题"/>
	</xsl:template>
	<xsl:template match="标题">
		<xsl:call-template name="PrintCurrentNode"/>
		<xsl:value-of select="text()"/>
	</xsl:template>
	<xsl:template name="PrintCurrentNode">
		<xsl:text>当前节点的名称为:</xsl:text>
		<xsl:value-of select="name()"/>
		<xsl:text>,节点在上下文中的位置是:</xsl:text>
		<xsl:value-of select="position()"/>
		<xsl:text>。</xsl:text>
	</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet href="mydoc.xsl" type="text/xsl"?>
<我的文档>
	<标题>XML实例分析</标题>
	<段落>这是第一段的内容</段落>
	<段落>this is 2nd paragraph</段落>
</我的文档>

转换结果:当前节点的名称为:,节点在上下文中的位置是:1。当前节点的名称为:标题,节点在上下文中的位置是:1。XML实例分析
上下文节点的改变
在XSLT处理器处理过程中,上下文节点从初始节点开始移动到模板中选定的节点
能改变上下文节点的XSLT指令是:
<xsl:apply-templates select=“XPath表达式”/> 从当前节点开始,找出所有匹配的节点,并逐一应用相应的模板进行处理
<xsl:for-each select=“XPath表达式”> 从当前节点开始,选出所有匹配的节点,按照指定的处理指令逐一处理各个节点
这里XPath表达式用于节点定位,必须能够指明节点位置

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions">
	<xsl:output method="html" encoding="gb2312"/>
	<xsl:template match="/">
		<table border="1">
			<tbody>
				<tr>
					<th>姓名</th>
					<th>语文</th>
					<th>数学</th>
				</tr>
				<xsl:apply-templates select="成绩单/班级"/>
				<xsl:apply-templates select="成绩单/班级" mode="平均"/>
			</tbody>
		</table>
	</xsl:template>
	<xsl:template match="班级">
		<xsl:apply-templates select="学生"/>
	</xsl:template>
	<xsl:template match="班级" mode="平均">
		<tr>
			<td>平均</td>
			<td>
				<xsl:value-of select="format-number(sum(学生/@语文)div count(学生), '###.0')"/>
			</td>
			<td>
				<xsl:value-of select="format-number(sum(学生/@数学)div count(学生), '###.0')"/>
			</td>
		</tr>
	</xsl:template>
	<xsl:template match="学生">
		<tr>
			<td>
				<xsl:value-of select="@姓名"/>
			</td>
			<td>
				<xsl:value-of select="@语文"/>
			</td>
			<td>
				<xsl:value-of select="@数学"/>
			</td>
		</tr>
	</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet href="scorelist.xsl" type="text/xsl"?>
<成绩单>
	<班级 名称="计算机1班">
		<学生 姓名="张三" 语文="87" 数学="60"/>
		<学生 姓名="李四" 语文="90" 数学="88"/>
		<学生 姓名="王五" 语文="80" 数学="70"/>
		<学生 姓名="马六" 语文="83" 数学="86"/>
	</班级>
	<班级 name="计算机2班">
	</班级>
</成绩单>

将输出改为分班级组表方式,即一个表格对应一个班,包含该班同学的成绩和平均成绩
······
内建模板规则
XSLT处理器内建3条模板规则:
内建模板用于匹配文档节点或其他未能被XSLT模板匹配的元素节点,对这些节点一一执行<xsl:apply-templates/> 这些节点可能是未定义匹配模板,也可能是匹配模板有“特殊”需要(用mode声明),也可能虽然已定义,但在apply-templates中未声明或声明错误
内建模板自动匹配所有属性和文本节点,并将节点的值输出到结果树中
内建模板匹配所有处理指令和注释,但是一个“空模板”,不执行任何操作
不包含任何模板的XSLT文档将从XML文档的根节点开始,遍历所有元素和文本节点,但不输出任何元素,只输出文本内容
模板的优先级
由于模板冲突较普遍,按如下方式处理优先级:
xsl:import导入的模板的优先级较低,而xsl:include包含的模板具有与当前模板相同的优先级
若指定了模板的优先级(priority属性),则按指定值处理
对于未声明优先级的模板,根据match属性值计算优先级:
任何节点测试:-0.5,如node()、text()、*、@*等
ns:*       -0.25,   可匹配指定名称空间的任何元素
元素名称:0,  可匹配指定名称的元素
@属性名称:0,  可匹配指定名称的属性
processing-instruction(pi):匹配指定名称的指令
其他:0.5,如 “/”、 “E1/E2”、 “E1/[E2]”、 “*/*”、 ……
使用了“|”分割的多个XPath表达式的模板规则,先将各表达式抽出,组成单独的模板分别计算优先级
内建模板的优先级最低

数据筛选

XSl流程控制语句
<xsl:if test="条件表达式">
some output
</xsl:if>
例如:
<xsl:if test="id[text()='1']">
</xsl:if>

chose与when-otherwise:
<xsl:choose>
   <xsl:when match="">
     some output
   </xsl:when>
   <xsl:otherwise>
     others output
   </xsl:otherwise>
<xsl:choose/>
例如:
<xsl:choose>
  <xsl:when test="id[text()='1']">
  </xsl:when>
  <xsl:otherwise>
  </xsl:otherwise>
</xsl:choose>

排序

sort一般放在for-each中,格式为:
 <xsl:sort select=“XPath表达式” />
例如:
 <xsl:for-each select=“班级”>
  <xsl:sort select=“学生/@学号”/>
  <xsl:value-of select=“学生”/>
 </xsl:for-each>
可以用order属性声明排序方式

<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions">
	<xsl:template match="/">
		<html>
			<head>
				<title><xsl:value-of select="书籍/书名"/></title>
			</head>
			<body>
				<h3>
					<xsl:value-of select="书籍/书名"/>
					<p><xsl:apply-templates select="书籍/作者"/></p>
				</h3>
				<h3>目录</h3>
				<xsl:apply-templates select="书籍/目录/章节" mode="标题"/>
				<xsl:apply-templates select="书籍/目录/章节" mode="简介"/>
			</body>
		</html>
	</xsl:template>
	<xsl:template match="作者">
		<xsl:value-of select="."/>
		<xsl:if test="position() != last()">
			<xsl:text>,</xsl:text>
		</xsl:if>
		<xsl:if test="position() = last()">
			<xsl:text> 著</xsl:text>
		</xsl:if>
	</xsl:template>
	<xsl:template match="章节" mode="标题">
		<h3><xsl:value-of select="@编号"/>、<xsl:value-of select="@标题"/></h3>
	</xsl:template>
	<xsl:template match="章节" mode="简介">
		<h3><xsl:value-of select="@编号"/>、<xsl:value-of select="@标题"/></h3>
		<xsl:value-of select="."/>
	</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet type="text/xsl" href="sampl1.xsl" ?>
<书籍>
	<书名>XML数据管理</书名>
	<作者列表>
		<作者>张三</作者>
		<作者>李四</作者>
		<作者>王五</作者>
	</作者列表>
	<年份>2001</年份>
	<目录>
		<章节 编号="1" 标题="XML简介">介绍XML的基本知识</章节>
		<章节 编号="2" 标题="DTD与Schema">XML文档的有效性</章节>
		<章节 编号="3" 标题="XML DOM">文档对象模型DOM</章节>
		<章节 编号="4" 标题="XML程序设计">利用DOM编写程序</章节>
	</目录>
</书籍>
 
数据导出

用output导出异构的XML文档或text、html文档,可以存入另一文件
output的格式为:
<xsl:output  method=“xml|html|text”
version=“2.0” encoding=“UTF-8”
omit-xml-declaration=“yes|no”
standalone=“yes|no”
…./>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值