XSTL接触
07月 11th, 2006 by 城市刀客
XSL是EXtensible Stylesheet Language的缩写,意思是可以扩展的样式单语言。我们知道如何用CSS格式化HTML/XHTML,虽然利用CSS(CSS = HTML Style Sheets)也可以格式化XML(针对浏览器而言)。但CSS的功能有限,而且CSS不符合XML规范,因此,我们需要使用XSL(XSL = XML Style Sheets)来更好地为XML文件定义样式。
当然,XSL不仅仅是一种样式语言。它包含下面三个部分:
XSLT:(XSL Transformations)XML格式转化
XPath: 通过路径表达式匹配节点
XSL-FO:(XSL Formatted Object)XSL格式对象
严格来说,很多人所说的XSL其实是指XSLT。要掌握XSL,应该先理解XPath和XSL-FO。
Step 1:理解XPath。
XPath是一个W3C标准。它是通过路径表达式来选择或调整XML文档的节点。它的路径表达式跟计算机的文件系统的路径非常相似。XPath包括100多个内建的functions,用来处理字符串,数字,布尔值,时间/日期的比较,节点顺序以及节点内容。
1、XPath节点:
在XPath里面,假定了一个XML文件包括下列7类节点:
处理指令 (processing-instruction)
根节点(document | root node)
元素 (element)
文本 (text)
属性 (attribute)
命名空间 (namespace)
注释 (comment)
举个简单的例子:students.xml
2、XPath语法:
1)普通选择:
前面已经说过,XPath是通过路径表达式来选择节点的,常用的选择节点的语法如下表:
表达式 说明
节点名称 选择该节点的所有子节点
/ 选择根节点
// 选择当前匹配条件的节点
. 选择当前节点
.. 选择当前节点的父节点
@ 选择属性
在上面的例子(students.xml)中,相应的选择表达式及其含义如下:
表达式 说明
students 选择students的所有子节点
/students 选择根节点students。注意:如果表达式是以“/”开始的,那么表示它使用的是绝对路径。
students/student 选择students的所有子节点student
//student 选择所有的student节点,不管它是否为students的直接子节点。
students//student 选择所有students的后代节点student,不管它是否为students的直接子节点。
//@lang 选择所有属性名为“lang”的属性值。
2)特定选择:特定选择通常用来查找特定节点或者包含特定内容的节点。特定选择在普通选择的基础上用方括号描述一些条件来实现特殊的节点查找。看例子:
路径表达式 结果说明
/students/student[1] 选择students的第一个子节点student
/students/student[last()] 选择students的最后一个子节点student
/students/student[position()<3] 选择students的前两个子节点student
//name[@lang] 选择具有lang属性的name元素
//name[@lang='EN'] 选择具有lang属性并且值为“EN”的name元素
/students/student[age>20] 选择students的子元素student,要求student的age元素的值大于20
/students/student[age>20]/name 选择students的子元素student下的age元素大于20的兄弟节点:name
3)通配符选择:通配符选择一般用于选择未知的节点。常用的有如下三种:
通配符 说明
* 匹配所有元素节点
@* 匹配所有属性节点
node() 匹配所有类型的节点
4)预定义关系选择:这些预定义关系都是相对当前节点而言的。
预定义关系 结果描述
ancestor 选择当前节点的祖先(包括父节点,祖父节点等等)
ancestor-or-self 选择当前节点的祖先(包括父节点,祖父节点等等)和当前节点本身
attribute 选择当前节点的所有属性
child 选择当前节点所有的子节点
descendant 选择当前节点的后代(包括儿子节点,孙子节点等等)
descendant-or-self 选择当前节点的后代(包括儿子节点,孙子节点等等)和当前节点本身
following 选择当前节点结束标记之后的所有内容
following-sibling 选择当前节点结束标记之后的所有兄弟节点
namespace 选择当前节点的所有命名空间
parent 选择当前节点的父节点
preceding 选择当前节点开始标记之前的所有内容
preceding-sibling 选择当前节点开始标记之前的所有兄弟节点
self 选择当前节点
语法:预定义关系::节点选择[选择条件]
例子:child::student //选择当前节点的所有子节点student。
5)XPath操作符:跟一般编程语言的操作符大体相同,注意不同的地方。见下表
操作符 说明 示例
| 和(这容易与编程语言的“或”搞乱) //book | //cd
+ 加 6 + 4
- 减 6 – 4
* 乘 6 * 4
div 除 8 div 4
= 等于 age=20
!= 不等于 age!=20
< 小于 age<20
<= 小于或等于 age<=20
> 大于 age>20
>= 大于或等于 age>=20
or 或 age=20 or age=30
and 并且 age>20 and age<30
mod 模(除法取余) 5 mod 2
未完,代续…..
Step 2:理解XSL-FO
XSL-FO是描述如何将XML数据格式化输出到显示器,纸张或其他媒体的符合XML规范的标记语言。XSL-FO文件的后缀是.fo或者.fob,但我们为了便于XML编辑器读取,通常以.xml为后缀。
1、XSL-FO文件的结构如下:
2、XSL-FO利用矩形区块输出。
XSL格式化模型定义了许多区块用来在显示内容。所有的内容(图片、文字等)都将被格式化到这些区块范围中输出。我们经常使用的有以下几种区块(从大到小):
Pages(页)
Regions(区域):包括region-body (the body of the page) ,region-before (the header of the page) ,region-after (the footer of the page) ,region-start (the left sidebar) ,region-end (the right sidebar)
Block areas(区域内区块)
Line areas(行)
Inline areas(行内)
Page & Page margin & Region示意图:
Step 3 :掌握XSLT
XSLT是一种将XML文档转化为HTML/XHTML或其他XML文档的语言。
1、声明XSLT的指令:<xsl:stylesheet> or <xsl:transform>.
为了能够访问XSLT的元素、属性和其他内容,我们必须在顶级元素声明XSLT的命名空间。xmlns:xsl=http://www.w3.org/1999/XSL/Transform表明我们使用的是W3C官方的XSLT命名空间,使用这个命名空间的同时,必须指定属性version="1.0"。
2、在XML中应用XSLT的指令:<?xml-stylesheet type="text/xsl" href="the url of the .xsl file"?>
3、模板元素:<xsl:template>
通过添加match属性,在match属性里使用XPath路径表达式选择匹配的节点。例如:<xsl:template match="/">
将匹配整个XML文档。
4、文本提取元素:<xsl:value-of>
通过添加select属性,在select属性里使用XPath路径表达式选择匹配的节点。例如:<xsl:value-of select="students/student/age"/>将提取students的子元素student下的age标签包含的文本。
5、循环控制元素:<xsl:for-each>
通过添加select属性,在select属性里使用XPath路径表达式选择匹配的节点。例如:
6、排序控制元素:<xsl:sort>
要对输出的结果排序,只需要在循环控制元素里面简单地添加一个<xsl:sort>元素即可。例如:
7、条件测试元素:<xsl:if>
通过添加test属性,在test属性里使用条件表达式选择匹配的节点。例如:
8、判断选择元素:<xsl:shoose>
通过联合<xsl:when>和<xsl:otherwise>,达到编程语言if…else….的判断效果。语法如下:
例子:
9、应用模板元素:<xsl:apply-templates>
这个元素给当前的元素或当前元素的子元素应用了一个模板。当然,该模版应该存在。
07月 11th, 2006 by 城市刀客
XSL是EXtensible Stylesheet Language的缩写,意思是可以扩展的样式单语言。我们知道如何用CSS格式化HTML/XHTML,虽然利用CSS(CSS = HTML Style Sheets)也可以格式化XML(针对浏览器而言)。但CSS的功能有限,而且CSS不符合XML规范,因此,我们需要使用XSL(XSL = XML Style Sheets)来更好地为XML文件定义样式。
当然,XSL不仅仅是一种样式语言。它包含下面三个部分:
XSLT:(XSL Transformations)XML格式转化
XPath: 通过路径表达式匹配节点
XSL-FO:(XSL Formatted Object)XSL格式对象
严格来说,很多人所说的XSL其实是指XSLT。要掌握XSL,应该先理解XPath和XSL-FO。
Step 1:理解XPath。
XPath是一个W3C标准。它是通过路径表达式来选择或调整XML文档的节点。它的路径表达式跟计算机的文件系统的路径非常相似。XPath包括100多个内建的functions,用来处理字符串,数字,布尔值,时间/日期的比较,节点顺序以及节点内容。
1、XPath节点:
在XPath里面,假定了一个XML文件包括下列7类节点:
处理指令 (processing-instruction)
根节点(document | root node)
元素 (element)
文本 (text)
属性 (attribute)
命名空间 (namespace)
注释 (comment)
举个简单的例子:students.xml
<?xml version="1.0" encoding="gb2312"?>
<students>
<student>
<name lang="CN">风云</name>
<age>25</age>
</student>
<student>
<name lang="EN">Rose</name>
<age>20</age>
</student>
</students>
其中,<?xml version="1.0" encoding="gb2312"?>为处理指令,students为根节点,<age>25</age>为元素节点, lang="CN"为属性节点。节点与节点之间存在父子,兄弟,祖先/后代等关系,这取决于节点处在XML文件结构树中的位置。2、XPath语法:
1)普通选择:
前面已经说过,XPath是通过路径表达式来选择节点的,常用的选择节点的语法如下表:
表达式 说明
节点名称 选择该节点的所有子节点
/ 选择根节点
// 选择当前匹配条件的节点
. 选择当前节点
.. 选择当前节点的父节点
@ 选择属性
在上面的例子(students.xml)中,相应的选择表达式及其含义如下:
表达式 说明
students 选择students的所有子节点
/students 选择根节点students。注意:如果表达式是以“/”开始的,那么表示它使用的是绝对路径。
students/student 选择students的所有子节点student
//student 选择所有的student节点,不管它是否为students的直接子节点。
students//student 选择所有students的后代节点student,不管它是否为students的直接子节点。
//@lang 选择所有属性名为“lang”的属性值。
2)特定选择:特定选择通常用来查找特定节点或者包含特定内容的节点。特定选择在普通选择的基础上用方括号描述一些条件来实现特殊的节点查找。看例子:
路径表达式 结果说明
/students/student[1] 选择students的第一个子节点student
/students/student[last()] 选择students的最后一个子节点student
/students/student[position()<3] 选择students的前两个子节点student
//name[@lang] 选择具有lang属性的name元素
//name[@lang='EN'] 选择具有lang属性并且值为“EN”的name元素
/students/student[age>20] 选择students的子元素student,要求student的age元素的值大于20
/students/student[age>20]/name 选择students的子元素student下的age元素大于20的兄弟节点:name
3)通配符选择:通配符选择一般用于选择未知的节点。常用的有如下三种:
通配符 说明
* 匹配所有元素节点
@* 匹配所有属性节点
node() 匹配所有类型的节点
4)预定义关系选择:这些预定义关系都是相对当前节点而言的。
预定义关系 结果描述
ancestor 选择当前节点的祖先(包括父节点,祖父节点等等)
ancestor-or-self 选择当前节点的祖先(包括父节点,祖父节点等等)和当前节点本身
attribute 选择当前节点的所有属性
child 选择当前节点所有的子节点
descendant 选择当前节点的后代(包括儿子节点,孙子节点等等)
descendant-or-self 选择当前节点的后代(包括儿子节点,孙子节点等等)和当前节点本身
following 选择当前节点结束标记之后的所有内容
following-sibling 选择当前节点结束标记之后的所有兄弟节点
namespace 选择当前节点的所有命名空间
parent 选择当前节点的父节点
preceding 选择当前节点开始标记之前的所有内容
preceding-sibling 选择当前节点开始标记之前的所有兄弟节点
self 选择当前节点
语法:预定义关系::节点选择[选择条件]
例子:child::student //选择当前节点的所有子节点student。
5)XPath操作符:跟一般编程语言的操作符大体相同,注意不同的地方。见下表
操作符 说明 示例
| 和(这容易与编程语言的“或”搞乱) //book | //cd
+ 加 6 + 4
- 减 6 – 4
* 乘 6 * 4
div 除 8 div 4
= 等于 age=20
!= 不等于 age!=20
< 小于 age<20
<= 小于或等于 age<=20
> 大于 age>20
>= 大于或等于 age>=20
or 或 age=20 or age=30
and 并且 age>20 and age<30
mod 模(除法取余) 5 mod 2
未完,代续…..
Step 2:理解XSL-FO
XSL-FO是描述如何将XML数据格式化输出到显示器,纸张或其他媒体的符合XML规范的标记语言。XSL-FO文件的后缀是.fo或者.fob,但我们为了便于XML编辑器读取,通常以.xml为后缀。
1、XSL-FO文件的结构如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="A4">
<!– Page template goes here –>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4">
<!– Page content goes here –>
</fo:page-sequence>
</fo:root>
2、XSL-FO利用矩形区块输出。
XSL格式化模型定义了许多区块用来在显示内容。所有的内容(图片、文字等)都将被格式化到这些区块范围中输出。我们经常使用的有以下几种区块(从大到小):
Pages(页)
Regions(区域):包括region-body (the body of the page) ,region-before (the header of the page) ,region-after (the footer of the page) ,region-start (the left sidebar) ,region-end (the right sidebar)
Block areas(区域内区块)
Line areas(行)
Inline areas(行内)
Page & Page margin & Region示意图:
Step 3 :掌握XSLT
XSLT是一种将XML文档转化为HTML/XHTML或其他XML文档的语言。
1、声明XSLT的指令:<xsl:stylesheet> or <xsl:transform>.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
//or
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
为了能够访问XSLT的元素、属性和其他内容,我们必须在顶级元素声明XSLT的命名空间。xmlns:xsl=http://www.w3.org/1999/XSL/Transform表明我们使用的是W3C官方的XSLT命名空间,使用这个命名空间的同时,必须指定属性version="1.0"。
2、在XML中应用XSLT的指令:<?xml-stylesheet type="text/xsl" href="the url of the .xsl file"?>
3、模板元素:<xsl:template>
通过添加match属性,在match属性里使用XPath路径表达式选择匹配的节点。例如:<xsl:template match="/">
将匹配整个XML文档。
4、文本提取元素:<xsl:value-of>
通过添加select属性,在select属性里使用XPath路径表达式选择匹配的节点。例如:<xsl:value-of select="students/student/age"/>将提取students的子元素student下的age标签包含的文本。
5、循环控制元素:<xsl:for-each>
通过添加select属性,在select属性里使用XPath路径表达式选择匹配的节点。例如:
<xsl:for-each select="students/student">
<span id="sname"><xsl:value-of select="name"/></span>
<span id="sage"><xsl:value-of select="age"/></span>
</xsl:for-each>
这将循环提取students的子节点下的name/age包含的文本。6、排序控制元素:<xsl:sort>
要对输出的结果排序,只需要在循环控制元素里面简单地添加一个<xsl:sort>元素即可。例如:
<xsl:for-each select="students/student">
<xsl:sort select="age"/>
<span id="sname"><xsl:value-of select="name"/></span>
<span id="sage"><xsl:value-of select="age"/></span>
</xsl:for-each>
意即在输出的时候对age数据域内的内容排序(默认从小到大)。7、条件测试元素:<xsl:if>
通过添加test属性,在test属性里使用条件表达式选择匹配的节点。例如:
<xsl:for-each select="students/student">
<xsl:if test="age > 24">
<span id="sname"><xsl:value-of select="name"/></span>
<span id="sage"><xsl:value-of select="age"/></span>
</xsl:if>
</xsl:for-each>
意即只输出age>24的节点内容。8、判断选择元素:<xsl:shoose>
通过联合<xsl:when>和<xsl:otherwise>,达到编程语言if…else….的判断效果。语法如下:
<xsl:choose>
<xsl:when test="expression">
… some output …
</xsl:when>
<xsl:otherwise>
… some output ….
</xsl:otherwise>
</xsl:choose>
例子:
<xsl:for-each select="students/student">
<span id="sname"><xsl:value-of select="name"/></span>
<xsl:choose>
<xsl:when test="age > 20">
<span id="sage" style="color:#F00"><xsl:value-of select="age"/></span>
</xsl:when>
<xsl:otherwise>
<span id="sage"><xsl:value-of select="age"/></span>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
9、应用模板元素:<xsl:apply-templates>
这个元素给当前的元素或当前元素的子元素应用了一个模板。当然,该模版应该存在。