Internet学习记录:XML_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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Lucia1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值