XSLT基本概念
可扩展样式单语言XSL( eXtensible Stylesheet Language),是由W3C定制的。XSL由三部分组成:
- XSLT。它是Extensible Stylesheet Language Transformation的缩写,称为可扩展样式单语言转换。XSLT的作用是将一个XML文档转换为另一种类别的XML文档(也包括HTML文档)。因此,可以利用XSLT将XML文档转换为HTML,以便在浏览器上显示。W3C最新的XSLT规范版本是XSLT 3.0。
- XPath。XPath的作用是指定访问XML数据的寻址路径表达式。
- XSL-FO(XSL Formatting Objects)。XSL-FO的作用是对XML文档中的数据排版,以显示这些数据设计美观的版面,满足印刷、打印的要求。
- 示例代码:
XSLT示例:
<?xml version="1.0" encoding="UTF-8"?>
<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" indent="yes" encoding="gb2312"></xsl:output>
<xsl:template match="/">
<html>
<head><title>个人信息介绍</title></head>
<body><h1>姓名:<xsl:value-of select="person/name"/></h1>
<ul>
<li>生日:<xsl:value-of select="person/birthdate"/></li>
<li>性别:<xsl:value-of select="person/sex"/></li>
<li>身高:<xsl:value-of select="person/high"/></li>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
被转换的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--通过处理指令引入XSLT文档-->
<?xml-stylesheet type="text/xsl" href="simple.xslt"?>
<person>
<name>田诗琪</name>
<birthdate>2011-04-11</birthdate>
<sex>女</sex>
<high>83cm</high>
</person>
在XML中引用XSLT
在XML文件中引入XSLT与在XML中引入CSS的方法大同小异,也是通过处理指令xml-stylesheet方式引入的,具体的代码格式如下:
<?xml-stylesheet type="text/xsl" href="xslt文件路径"?>
说明:
<?xml-stylesheet>
是处理指令,为XMl解析器制定显示时所使用的样式;
type
:指定样式单文件的格式,如果要引入的是xsl或xslt文件,则该属性值必须为“text/xsl”;
href
:用于指定XSLT文件或XSL文件的URl;
XSLT的转换模式
转换过程包括两种:
服务器端转换模式
客户端转换模式
-
服务器端转换模式
这种模式下,XML文件在服务器端先由XSLT文件转换为一个新的文件,通常是HTML文件,然后再将该文件发送给浏览器,由浏览器进行解析。服务器转换的工具包括Saxon、Xalan、微软的msxsl.exe,以及XmlSpy自带的工具等。
服务器转换还可以细分为:- 实时转换
实时转换:当服务器接收到来自客户端的请求时,借助于动态脚本语言(例如:JSP)根据XSLT将XML进行转换,将转换后的结果(例如:HTML)发送给客户端。如图所示:
- 批量转换
批量转换:批量转换预先根据XSLT将XML转换,将转换后的结果保存到服务器上,当接到客户端请求时将预先转换好的结果文件发送给客户端。
- 实时转换
-
客户端转换模式
这种方式是将XML文件和XLST文件都传送到客户端,由浏览器进行实时转换。这种模式下浏览器必须支持XML和XSLT。目前IE6、Firefox3.0、Opera9.5及以上版本对XSLT都有较好的支持。具体的转换过程如图所示:
XSLT的基本语法
XSLT本身也是XML文件,因此编写XSLT文档的基本约束与XML文件相同。该文件也需要有一个根元素,其内部嵌套了多种标记,每种标记表达了不同的含义。
- XSLT的根元素可以是
<stylesheet>
和<transform>
<output>
标记用于控制输出文档的类型及格式。该元素作为<stylesheet>
或<transform>
的子元素。语法格式如下:
<output method="xml|html|text" vesion=""
encoding="" omit-xml-declaration="yes|no"standalone="" doctype-public=""
doctype-system="" cdata-section-elements=""
indent="" media-type="text/xml|text/html|text/plain">
-
转换为XML文档的output标记设定:
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
转换为新的XML文档后的代码:
<?xml version="1.0" encoding="UTF-8"?>
-
ouput标记设定输出HTML简单设定
<xsl:output method="html" encoding="gb2312"></xsl:output>
转换HTML后的结果:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
-
XSLT模板有两种:
模板规则
(Template Rule)和具名模板
(Named Template) -
所谓模板规则是定义的模板匹配并处理指定的XML节点,必须有match属性,属性值为XPath表达式,指明该模板可匹配哪些XML节点。
<xsl:template>
标记定义规则模板的语法:
<xsl:template match="" mode="">
......规则
</xsl:template>
属性说明:
match
属性用于关联 XML 元素和模板,属性值是XPath路径,用于指定模板应用于哪些节点,一个模板对应一组规则,模板中的规则用于控制XML文档的输出。也可用来为整个文档定义模板(举例,match="/" 定义整个文档)。
mode
属性是一个可选属性。当需要对同一个节点定义不同规则模板,在不同情况下需要使用不同的模板时,定义模板就需要使用mode属性,mode属性的属性值必须唯一。 -
<apply-templates>
标记用来调用已定义的规则模板,<apply-templates>
标记的语法:
<apply-templates [select=" "] [mode="a"]/>
属性说明:
select
是一个可选的属性,该属性值必须是一个XPath值,用于指定哪些标记需要调用另一个模板来处理。如果select属性省略,则按照当前节点集顺序来处理每一个节点,每一个节点都由另一个模板来处理。
使用带有mode
属性的模板时apply-template 元素也需要增加mode属性,且属性值与模板定义的属性值相同。 -
所谓具名模板是具有具体名称的模板,可以被
call-template
元素反复调用,处理当前的XML上下文内容。必须有name
属性,以便调用。
<xsl:template>
标记定义具名模板的语法:
<xsl:template name="">
......规则
</xsl:template>
属性说明:
name
属性用于定义模板的名字,该名字是一个固定的值。 -
<call-template>
标记用来调用已定义的具名模板,<call-template>
标记的语法:
<xsl:call-template name="value">
属性说明:
name
属性用于指定所调用的具名模板的名字。 -
定义了传递给模板的参数的值。
<xsl:with-param> 标记的语法:
<xsl:with-param name="name" select="expression">
<!-- Content:template -->
</xsl:with-param>
属性说明:
name属性是必需给出的,规定了参数的名称。
select属性给出了定义的参数的值,是一个 XPath 表达式
- 获取传递的参数需要使用
<xsl:param>
元素,该元素用于声明局部或全局参数。如果在模板内声明参数,就是局部参数,如果作为顶层元素来声明,就是全局参数。
xsl:param 标记的语法:
<xsl:param name="name" select="expression">
<!-- Content:template -->
</xsl:param>
属性说明:
name属性是必需给出的,规定了参数的名称。
select属性值是参数的默认值,是一个 XPath 表达式。
转换为HTML文档常用标记
-
<value-of>
标记
用于输出节点的内容。
标记语法:
<value-of select="" [disable-output-escaping="yes|no"]/>
属性说明:
select
属性:是一个XPath表达式,将该表达式所对应的内容显示出来
disable-output-escaping
属性:是一个可选属性,表示输出文本内容时是否禁用转义 -
<for-each>
标记
遍历被选择的节点集,遍历过程中被迭代处理的节点作为当前节点。
<for-each>
语法:
<for-each select="">迭代体</for-each>
属性说明:
select
属性:这个属性必须给出,该属性值是一个XPath表达式,表示一个节点集。 -
<if>
标记
<if>
标记的作用相当于if语句。<if>
标记的语法:
<if test="">
内容
</if>
属性说明:
test
属性:必须给出,该属性值是一个布尔表达式或一个布尔值。当属性值为true时,计算输出该元素包含的内容,否则不执行.
<choose>
、<when>
和<otherwise>
标记
类似于switch语句执行多条件判断。注意:<choose>
、<when>
和<otherwise>
标记中可以包含多个分支<when>
。它表示,当每一个分支的条件都不满足时,如果有<otherwise>
则执行该分支。语法格式:
<choose>
[<when test>内容</when>]+
[<otherwise>内容</otherwise>]?
</choose>
属性说明:
test:必须给出,该属性值是一个布尔表达式或一个布尔值。当属性值为true时,计算输出该元素包含的内容,否则不执行。
<sort>
标记
<sort>
标记用于将元素按照指定的顺序进行排序,<sort>
标记的语法:
<sort select="XPath表达式"
lang=""
data-type="text|number|QName"
order="ascending|descending"
case-order="upper-first|lower-first"
>
属性说明:
select:属性值为一个XPath表达式
lang:用于指定排序顺序的语言字母表
data-type:指定字符串的数据类型,如果不指定则使用表达式的类型作为默认类型
order:指定使用升序(ascending)还是降序descending,case-order:指定大写字母在小写字
母之前(upper-first)还是之后(lower-first)
<element>
标记
用于在结果树中动态的创建元素。使用创建的元素,其元素名称和元素值都是可变的。语法格式:
<element name="" namespace=""use-attribute-sets="">
属性说明:
name:该属性是必须属性,指定所要创建的元素名称。
namespace:该属性是可选的,如果属性包含命名空间,该属性指定命名空间。
use-attribute-sets:多个属性的集合,多个名字中间以空白间隔。
<variable>
标记
<variable>
的语法:
<variable name="name" select="expression"/>
属性说明:
name:变量名
select:是一个XPath表达式,该表达式的值作为变量的值
<attribute-set>
标记
多个属性经常放在一起使用,为了更方便的复用,这时可以使用<attribute-set>
。该元素作为<stylesheet>
或<transform>
的子元素。
语法格式:
<attribute-set name="" use-attribute-sets="">
<attribute>+
</attribute-set>
属性说明:
name:必填属性,用于指定该属性集的名字
use-attribute-sets:可以指定多个属性集的名字。多个名字之间以空白间隔。
-
<copy>
和<copy-of>
标记
将源文档的节点直接复制到结果文档中,XSLT提供了以下两个元素:<copy>
用于将源文档的节点复制到结果文档中;<copy-of>
用于将源文档里节点集复制到结果文档中。 -
<comment>
标记
建立注释文字,例如:
<xsl:comment>
This is a comment!
</xsl:comment>
<processing-instruction>
标记
用于创建处理指令。语法格式:
<processing-instruction name="">
属性说明:
name:处理指令的指令名称
<import>
标记
<import>
可导入另一份XSLT样式单。注意:<import>
元素只能作为<stylesheet>
和<transform>
的子元素,并且位于其它子元素之前,重复样式的优先级从高到低为原样式单的样式、后导入的样式单的样式,先导入的样式单的样式、调用被覆盖的样式<apply-imports>
。
语法:
<import href=""/>
属性说明:
href:用来指定被导入的XSLT文档的URI地址
<include>
标记
用于包含另一份XSLT文档。注意: 被包含文件和包含文件的样式不能相同。如果相同则会出现异常。
语法:
<include href=""/>
属性说明:
href:用来指定被导入的XSLT文档的URI地址