XLST
XSLT的概念
- XSLT的英文标准名称为eXtensible Stylesheet Language Transformation
- 根据W3C的规范说明书(http://www.w3.org/TR/xslt),最早设计XSLT的用意是帮助XML文档(document)转换为其它文档。但是随着发展,XSLT已不仅仅用于将XML转换为HTML或其它文本格式,更全面的定义应该是:XSLT是一种用来转换XML文档结构的语言
为什么要用XSLT
- XML从根本上解决了应用系统间的信息交换,因为XML满足了两个基本的需求:
- 将数据和表达形式分离
- 在不同的应用之间传输数据
- XSLT就是用来实现这种转换功能的语言。将XML转换为HTML,是目前XSLT最主要的功能。
XSLT的历史
- 1995年由James Clark提议;
- 1997年8月正式提案为XSL;
- 1998年5月由Norman Walsh完成需求概要;
- 1998年8月18日XSL草案发布;
- 1999年11月16日正式发布XSL 1.0推荐版本。
- 目前,XSLT仍然在快速的发展中,XSLT1.1的草案已经可以在W3C网站上看到
XSL系列的"家族"关系
- 如果将XML文档看作一个数据库,XPath就是SQL查询语言;如果将XML文档看成DOS目录结构,XPath就是cd、dir等目录操作命令的集合
XSLT和CSS的比较
- CSS同样可以格式化XML文档,那么有了CSS为什么还需要XSLT呢?
- CSS不能重新排序文档中的元素;
- CSS不能判断和控制哪个元素被显示,哪个不被显示;
- CSS不能统计计算元素中的数据;
- CSS只适合用于输出比较固定的最终文档。CSS 的优点是简洁,消耗系统资源少;而XSLT功能强大,但要重新索引XML结构树,消耗内存较多。
- 常常将它们结合起来使用,比如在服务器端用XSLT处理文档,在客户端用CSS来控制显示。可以减少响应时间。
XSLT处理器工作原理
XSLT如何转换XML
- 将XML原文档输入,用XSL作为模板,通过转换引擎,最终输出需要的HTML文档
- XML文档hello.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<greeting>Hello, world!</greeting>
- XSLT文档hello.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>First XSLT example</title>
</head>
<body>
<p><xsl:value-of select="greeting"/></p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
- IE5.0以上版本浏览器打开这个hello.xsl文件看到XSL的结构树
- XML中调用这个XSL文件。修改hello.xml的代码为:
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="hello.xsl"?>
<greeting>Hello, world!</greeting>
- 用IE5.5以上打开hello.xml文件,就可以看到结果
XSLT的用途
- XSLT的主要用途就是数据转换应用。
- 由于以XML为基础的电子商务广泛普及, XSLT作为数据转换的角色也越来越重要。例如直接将电视新闻的数据格式转换成报纸新闻需要的数据格式;将股票数据直接转换成图片显示在网页上;对EDI(电子数据交换)数据进行统计,排序等等。
- XSLT是处理类似工作的理想工具
XSLT的元素语法
xsl:template和xsl:apply-templates
- 模板(template)是XSLT中最重要的概念之一。XSLT文件就是由一个一个的模板组成,任何一个XSLT文件至少包含一个模板
- 模板(template)由两部分组成:匹配模式(match pattern)和执行。对应的语法为xsl:template和xsl:apply-templates。
- xsl:template的语法是:
<xsl:template
match = pattern
name = qname
priority = number
mode = qname>
<!-- 执行内容 -->
</xsl:template>
- xsl:template的作用是定义一个新模板
- xsl:template示例
假设我们要处理一个包含章节和段落文档。我们用para元素定义段落,用chapter元素定义章节。我们来看看match属性可能的值。 下面的语句写法说明模板匹配所有的para元素
<xsl:template match="para">
</xsl:template>
下面的语句写法说明模板匹配所有的para元素和所有的chapter元素:
<xsl:template match="(chapter|para)">
</xsl:template>
下面的语句写法说明模板匹配所有的父节点为chapter元素的para元 素:
<xsl:template match="chapter//para">
</xsl:template>
下面的语句写法说明模板匹配根节点:
<xsl:template match="/">
</xsl:template>
- apply-templates语法
<xsl:apply-templates
select = node set-expression mode = qname>
</xsl:apply-templates>
- xsl:apply-templates用来执行那一个节点被模板具体处理。xsl:apply-templates总是包含在xsl:template元素中
- apply-templates示例
<xsl:template match="/">
<xsl:apply-templates select="para"/>
</xsl:template>
这段代码说明模板匹配整个文档(根节点),具体执行时处理根节点下所有para元素。
<xsl:template match="para">
<p><xsl:apply-templates/></p>
</xsl:template>
而这一段代码则表示模板匹配para节点,所有para下的子元素都将被处理。
xsl:value-of & xsl:copy-of
- XSL:value-of用来将源文档中元素的文本值写到输出文档中。例如: 有一个个人资料的XML文档:
<?xml version="1.0" encoding="iso-8859-1"?>
<PERSON>
<name>ajie</name>
<age>28</age>
</PERSON>
- 如果想在输出文档中显示上面这个XML源文档中的name元素的值,可以这样写XSLT代码:
<xsl:template match="PERSON">
<xsl:value-of select="name"/>
</xsl:template>
xsl:for-each
xsl:for-each语法允许你循环处理被选择的节点。例如:有一个含多个个人资料的XML文档:
<?xml version="1.0" encoding="iso-8859-1"?>
<PEOPLE>
<PERSON>
<name>ajie</name>
<age>28</age>
</PERSON>
<name>tom</name>
<age>24</age>
</PERSON>
<PERSON>
<name>miake</name>
<age>30</age>
</PERSON>
</PEOPLE>
需要显示所有人的姓名,则可以将XSLT代码写成:
<xsl:template match="PEOPLE">
<xsl:for-each select="child::PERSON">
<xsl:value-of select="name"/>
</xsl:for-each>
</xsl:template>
xsl:if
xsl:if类似普通程序语言的if条件语句,允许设定节点满足某个条件时,被模板处理。xsl:if的语法格式为:
<xsl:if test=布尔表达式> template body
</xsl:if>
例如:
<xsl:template match="PEOPLE">
<xsl:if test="name">
<p><xsl:value-of select="name"/></p>
</xsl:if>
</xsl:template>
xsl:choose, xsl:when 和 xsl:otherwise
xsl:if语法没有else的属性。如果要进行多项选择,那么就要使用xsl:choose / xsl:when / xsl:otherwise系列流程控制语法了。例如:
<xsl:template match="PEOPLE">
<xsl:choose>
<xsl:when test="name = 'ajie'">
<B><xsl:value-of select="name"/></B>
</xsl:when>
<xsl:when test="name">
<I><xsl:value-of select="name"/></I>
</xsl:when>
<xsl:otherwise> No name available
</xsl:otherwise>
<xsl:choose>
</xsl:template>
xsl:sort
在XSLT中可以对XML源文档的元素进行重新排序, 排序的语法就是xsl:sort。举例:下面的代码就是将文档元素按name排序。
<xsl:template match="PEOPLE">
<xsl:apply-templates select="PERSON">
<xsl:sort select="name"/>
</xsl:apply-templates>
</xsl:template>
XPath的语法
当前位置
- 使用XSLT处理XML源文档时,用Context来表示当前正在被模板处理的节点位置。比如xsl:template match=“/”语句中表示Context在文档的根(root)节点。Context类似于C语言里的指针,表示程序当前运行的位置。
- Location Paths是用于设定想要寻找的Context节点位置。
<xsl:for-each select="child::PEOPLE/descendant::PERSON">
<xsl:for-each select="PEOPLE//PERSON">
寻址操作
- Axis和Predicate是XPath语法中对Location Paths进行定位操作的语法
- Axis语法表
表达式 | 简写 | 说明 |
---|---|---|
self | . | 选择当前节点 |
parent | … | 选择当前节点的父节点 |
attribute | @ | 选择一个元素的所有属性 |
child | 选择当前节点的所有子元素 | |
ancestor | 选择当前节点的所有父元素 |
- Axis选择当前节点周围所有的节点,而Predicate 则用来定位当前节点内部的元素。表示方法为方括号[]中加表达式:[ Expression ]。例如:
PERSON[position()=2]
PERSON[starts-with(name, "B")]
运算符
运算符 | 说明 |
---|---|
and, or | 普通意义的and, or |
= | 等于 |
!= | 不等于 |
>, >= | 大于,大于等于 |
<,<= | 小于,小于等于 |
+,-,*,div | 加减乘除 |
mod | 取模 |
两个节点一起计算 |
功能函数
count()
- 作用:统计计数,返回符合条件的节点的个数。
- 举例:
<p><xsl:value-of
select="count(PERSON[name=tom])"/></p>
number()
- 作用:将属性的值中的文本转换为数值。
- 举例:
<p>The number is: <xsl:value-of
select="number(book/price)"/></p>
substring()
- 语法:substring(value, start, length)
- 作用:截取字符串。
- 举例:
<p><xsl:value-of select="substring(name, 1, 3)"/></p>
sum()
- 作用:求和。
- 举例:
<p>Total Price = <xsl:value-of select="sum(//price)"/></p>>
XSLT的资源
- http://www.w3.org/Style/XSL/
- XSLT1.0 http://www.w3.org/TR/xslt.html
- XSLT1.1 http://www.w3.org/TR/xslt11/
- XPath1.0 http://www.w3.org/TR/xpath.html