Chinaunix首页 | 论坛 | 博客
  • 博客访问: 843319
  • 博文数量: 372
  • 博客积分: 10063
  • 博客等级: 中将
  • 技术积分: 4220
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 11:36
文章分类

全部博文(372)

文章存档

2012年(372)

分类: 虚拟化

2012-03-22 18:21:14

本文内容
  1. 引言
  2. CSS级联样式表
  3. XSL基础
  4. XSL文档结构
  5. XSL元素
  6. XSLT
  7. XPath基础
  8. XPath表达式
  9. XPath定位路径

1.引言

下面是一个xml的文件,如果用浏览器直接打开,会是什么效果呢?

product.xml

xml version="1.0" encoding="gb2312"?>
<PRODUCTS>
<PRODUCT PRODID="p001" CATEGORY="Toy">
<PRODUCTNAME>模型飞机PRODUCTNAME>
<DESCRIPTION>适合于5岁以上儿童DESCRIPTION>
<PRICE>239PRICE>
<QUANTITY>20QUANTITY>
PRODUCT>
<PRODUCT PRODID="p002" CATEGORY="Toy">
<PRODUCTNAME>电动汽车PRODUCTNAME>
<DESCRIPTION>适合4岁以上儿童DESCRIPTION>
<PRICE>860PRICE>
<QUANTITY>12QUANTITY>
PRODUCT>
PRODUCTS>

很显然,浏览器仅仅是作为一个xml文件的解析器,无法理解这些标记的含义,所以它就将文件原封不动的显示出来。嘿嘿!想要控制xml像web页面那样显示,就需要用到W3C推荐的样式表标准:CSS级联样式表XSL可扩展样式表

2.CSS级联样式表

CSS是一种文本文档,用于控制XML文档和HTML文档中的标签如何被格式化。简单点来说, 怎样去显示文档中的内容。

不过CSS与XML结合时存在局限性:

(1)CSS可以格式化XML文档,能够很好的控制输出的样式,比如色彩、字体、大小等,但只能静态控制文档的样式或外观

(2)CSS不能重新排序文档中的元素

(3)CSS不能动态判断和控制元素的显示

(4)CSS无法动态统计元素中的数据

至于CSS的语法规则这里不多说,可以去参考其他资料

那应该如何让XML与CSS关联起来呢?

在XML中通过xml-stylesheet指令引入CSS样式表,其语法格式如下:

xml-stylesheet type="text/css" href="location" ?>
(1)处理指令中的type属性是正在使用的样式表的类型。对CSS来说,其值是text/css,对XSL来说,则是text/xsl

(2)处理指令中的href属性值是一个URL,通常是相对值,指明在何处可找到样式表。如果样式表没有找到,Web浏览器很可能使用其缺省的样式表,此时浏览器可能会报告一条错误信息

现在我们引入product.css:

product.xml:

xml version="1.0" encoding="gb2312"?>
xml-stylesheet type="text/css" href="product.css"?>
<PRODUCTS>
<PRODUCT PRODID="p001" CATEGORY="Toy">
<PRODUCTNAME>模型飞机PRODUCTNAME>
<DESCRIPTION>适合于5岁以上儿童DESCRIPTION>
<PRICE>239PRICE>
<QUANTITY>20QUANTITY>
PRODUCT>
<PRODUCT PRODID="p002" CATEGORY="Toy">
<PRODUCTNAME>电动汽车PRODUCTNAME>
<DESCRIPTION>适合4岁以上儿童DESCRIPTION>
<PRICE>860PRICE>
<QUANTITY>12QUANTITY>
PRODUCT>
PRODUCTS>

product.css:

PRODUCTNAME
{font-family:Arial;
font-size
:20pt;
font-weight
:bold;
color
:red;
display
:block;
padding-top
:6pt;
padding-bottom
:6pt
}
PRICE,DESCRIPTION,QUANTITY
{font-family:Arial;
font-size
:12pt;
color
:teal;
display
:block;
padding-top
:3pt;
padding-bottom
:3pt
}

浏览器效果:


3.XSL基础

如果说HTML与CSS是最佳搭档的话,那么XSL就是XML的就是天作之和了。先来看基本的定义

XSL(eXtensible Stylesheet Language)是一种基于XML的语言,是一种显示XML文件的规范,遵循XML的规范制定。

XSL实际上包含三种语言:

(1)XSLT是一种转换XML的语言,着重于XML文档转换

(2)XPath是一种用来访问XML文档不同部分或模式的语言,着重于从XML层次结构上访问结点

(3)XSLFO(XSL格式化对象)是一种定义XML显示方式的语言,着重于格式对象,作用就类似CSS在HTML中的作用

4.XSL文档结构

XSL文档本身是格式良好的XML文档,在XSL文件的开头要有和XML文件相同的声明,XSL文档的标准格式如下

<xsl:stylesheet version="1.0“
xmlns:xsl="
">
模板规则
输出模板
xsl:stylesheet>

语法解析:

既是XSL的声明语句,也是根元素,必须位于文件的首部,xsl是代表着stylesheet元素所属命名空间的前缀

例子:

student.xml:

xml version="1.0" encoding="gb2312"?>
xml-stylesheet type="text/xsl" href="student.xsl"?>
<class>
<student ID="101">
<name>李华name>
<***>***>
<birthday>1988.12.12birthday>
<score>92score>
<skill>Javaskill>
student>
<student ID="102">
<name>王燕name>
<***>***>
<birthday>1989.9.10birthday>
<score>89score>
<skill>Visual Basicskill>
student>
<student ID="103">
<name>张磊name>
<***>***>
<birthday>1987.9.9birthday>
<score>98score>
<skill>UMLskill>
student>
<student ID="104">
<name>杨菲name>
<***>***>
<birthday>1989.6.16birthday>
<score>85score>
<skill>SQL Serverskill>
student>
class>

student.xsl:

xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="">
<xsl:template match="/">
<html>
<head>
<title>学生成绩单title>
head>
<body>
<h2 align="center">学生成绩单h2>
<table border="2" cellpadding="0" align="center">
<tr bgcolor="#9acd32">
<th>姓名th>
<th>性别th>
<th>生日th>
<th>成绩th>
tr>
<xsl:for-each select="/class/student">
<tr>
<td>
<xsl:value-of select="name"/>
td>
<td>
<xsl:value-of select="***"/>
td>
<td>
<xsl:value-of select="birthday"/>
td>
<td>
<xsl:value-of select="score"/>
td>
tr>
xsl:for-each>
table>
body>
html>
xsl:template>
xsl:stylesheet>

浏览器效果:

5.XSL元素

根据上面的例子可以总结出元素的种类。
(1)元素
模板(template)是XSLT中最重要的概念之一,模板由两部分组成:匹配模式(match pattern)和执行。
元素的match属性,指定要将该模板应用于输入文档的哪些节点,match属性的值是一个XPath表达式

示例代码

模板匹配所有的name元素:

<xsl:template match="name">
xsl:template>
模板匹配所有的父节点为student元素的name元素:
<xsl:template match="student//name">
xsl:template>

(2)元素

使用元素可用来取出XML文件中被选择的元素或属性的内容,语法格式如下:
<xsl:value-of select ="匹配模式"/>

(3)元素

若想循环选择多条数据,可使用元素。其语法格式如下:

<xsl:for-each select="匹配模式">

xsl:for-each>

(4)元素

如需对结果进行排序,只需在XSL文件中的元素内部添加一个元素即可。其语法格式如下:
<xsl:sort select="匹配模式" order="ascending|descending"
case-order
="upper-first|lower-first" data-type="text|number|qname"/>

(5)元素

类似普通程序语言的if条件语句,允许设定节点满足某个条件时,被模板处理。其语法格式如下:

<xsl:if test="匹配模式">

xsl:if>


(6)元素

如果需要进行多项选择,可以使用系列流程控制语句,其语法格式如下:
<xsl:choose>
<xsl: when test="匹配模式">

xsl:when>
<xsl:when test="匹配模式">

xsl:when>
... ...
<xsl:otherwise>

xsl:otherwise>
xsl:choose>

(7)元素

元素用来指示处理器发现一个合适的模板,并且在每个选择的元素上执行指定的任务,可以将其理解为程序中的子函数调用。其语法格式如下:
<xsl:apply-templates select ="匹配模式">
xsl:apply-templates>
pselect属性用来定义确切的节点名称,是可选的,缺省值是“node()”,意味着对当前结点的所有子节点执行该模板

6.XSLT

XSLT(eXtensible Stylesheet Language Transformation)是一种用来转换XML文档结构的语言。

XSL的处理过程:

首先是根据XML文档构造源树,然后根据XSL规则将源树转换为结果树,生成结果树后,对其进行解释,格式化为一种适合显示、打印或是播放的格式。

XSLT和CSS的比较:

CSS

XSLT

使用简单

使用复杂

不能排序、添加或删除元素

可排序、添加或删除元素

不能访问文档除元素外的其它信息

能访问其它信息

使用内存比较少

使用较多内存和处理器能力

与XML语法不同

语法与XML相同


7.XPath基础

XPath就是一种专门用来在XML文档中定位和查找信息的语言,通过XPath可对XML文档中的元素和属性进行遍历,是高级XML应用的基础 。

XPath主要有四种数据类型:

(1)节点集

(2)布尔类型

(3)字符串类型

(4)数值类型

在XPath中,可以将节点划分为七种节点类型:

(1)根节点(Root Node)

(2)元素节点(Element Nodes)

(3)文本节点(Text Nodes)

(4)属性节点(Attribute Nodes)

(5)命名空间节点(Namespace Nodes)

(6)处理指令节点(Processing Instruction Nodes)

(7)注释节点(Comment Nodes)
XPath节点关系:
(1)父(parent)
(2)子(children)
(3)同胞(sibling)
(4)先辈(ancestor)
(5)后代(descendant)

8.XPath表达式

XPath将XML文档看作由节点构成的层次树,通过编写XPath表达式来定位树中特定的节点

XPath路径表达式:

表达式

描述

nodename

选取此节点的所有子节点

/

从根节点选取,绝对路径,表示当前文档的根节点

//

从任意节点选取,相对路径,表示当前文档所有的节点

.

选取当前节点

..

选取当前节点的父节点

@

选取属性


例子:

xml version="1.0" encoding="GB2312"?>
<bookstore>
<book>
<title lang="en">RESTful Web Servicestitle>
<price>29.00price>
book>
<book>
<title lang="zh">C#编程基础title>
<price>46.00price>
book>
bookstore>

解析:

bookstore

选取 bookstore 元素的所有子节点

/bookstore

选取根节点bookstore元素

/bookstore/book/price

选取bookstore元素下所有book元素的所有price元素

/bookstore/book/*

选取/bookstore/book的所有子元素

bookstore/book

选取bookstore元素下所有的book子元素

//bookstore

选取文档中所有的bookstore元素,无论它在什么层次

bookstore//book

选取在bookstore元素下所有的book元素,无论它们位于bookstore之下的什么位置

/bookstore/*/price

选取bookstore的子元素中,包含有price作为子元素的元素

//*

选取文件中的所有元素

//@lang

选取所有名为 lang 的属性

谓语表达式:

路径表达式

描述

/bookstore/book[last()]

选取属于bookstore子元素的最后一个book元素

/bookstore/book[last()-1]

选取属于bookstore子元素的倒数第二个book元素

/bookstore/book[position()<3]

选取前两个属于bookstore元素的子元素的book元素

//title[@lang]

选取所有拥有名为lang的属性的title元素

//title[@lang="en"]

选取所有title元素,且这些元素拥有值为 eng 的 lang 属性

/bookstore/book[price>15.00]

选取所有bookstore元素的book元素,且其中的price元素的值须大于15.00

/bookstore/book[price>15.00]/title

选取所有bookstore元素中的book元素的title元素,且其中的price元素的值须大于15.00

//title[@*]

选取所有带有属性的 title 元素

如果需要选择一个以上的路径,可以在XPath表达式中使用“|”运算符:

路径表达式

描述

//book/title | //book/price

选取所有book元素的title和price元素

//title | //price

选取文档中所有的title和price元素

/bookstore/book/title | //price

选取所有属于bookstore元素的book元素的title元素,以及文档中所有的price元素

XPath表达式的常用运算符:

运算符

描述

实例

|

计算两个节点集

//book | //cd,返回所有带有 book 和 cd 元素的节点集

+

加法

6 + 4,

-

减法

6 - 4

*

乘法

6 * 4

div

除法

8 div 4

=

等于

price=15

!=

不等于

price!=15

<

小于

price<15

<=

小于或等于

price<=15

>

大于

price>15

>=

大于或等于

price>=15

or

price=15 or price=35

and

price>15 or price<35

mod

计算除法的余数

5 mod 2

9.XPath定位路径

定位步骤从左到右,依次按顺序计算
XPath的定位步骤的语法如下:

轴名::节点测试[谓语]

其中:

(1)轴(axis),定义某个相对于当前节点的节点集。

(2)节点测试(node-test),识别某个轴内部的节点
(3)谓语(predicate),零或多个预测,以更深入地提炼所选的节点集

示例代码:child::price[price=9.90]

XPath的轴名称 :

轴名称

描述

ancestor

选取当前节点的所有先辈

ancestor-or-self

选取当前节点的所有先辈以及当前节点本身

attribute

选取当前节点的所有属性

child

选取当前节点的所有子元素

descendant

选取当前节点的所有后代元素

descendant-or-self

选取当前节点的所有后代元素以及当前节点本身

following

选取文档中当前节点的结束标签之后的所有节点

namespace

选取当前节点的所有命名空间节点

parent

选取当前节点的父节点

preceding

选取文档中当前节点的开始标签之前的所有节点

preceding-sibling

选取当前节点之前的所有同级节点

self

选取当前节点

阅读(628) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~