公司最近的项目数据是xml格式的又用到的xsl转换,找了点资料学习总结记录一下。
XML介绍
什么是xml
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
xml的作用
XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。
简单的说,我们在开发中使用XML主要有以下两方面应用:
1. XML做为数据交换的载体,用于数据的存储与传输
2. XML做为配置文件
XML与HTML的区别
XML 不是 HTML 的替代。
XML 和 HTML 为不同的目的而设计:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
XML 元素必须遵循以下命名规则:
名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始
名称不能包含空格
可使用任何名称,没有保留的字词。
转义字符
在xml中内置了一些特殊字符,这些特殊字符不能直接被浏览器原样输出,如果希望把这些特殊字符按照原样输出到浏览器,对于这些特殊字符进行转义,转义之后的字符就叫转义字符。
“<”-----> "<"
">"--------> ">"
" " " ------> " ""
"&" -------> "&"
"空格"-------> " "
CDATA块
作用:转义一堆特殊字符
XML基本语法--标签
1)<student></student>开始标签 标签体内容 结束标签
<student/> 或<student></student>空标签,没有标签体内容
2)xml标签名称区分大小写
3)xml标签一定要正确配对
4)xml标签不能以数字开头
5)XML 中的空格会被保留
6)特殊字符必须转义
7)注意:在一个xml文档中有且仅有一个根标签
属性
语法<student name=”eric”>student</student>
注意:1)属性必须用引号包括,不能省略,也不能单双引号混用
2)一个标签内可以有多个属性,但是不能出现重复的
我们将符合上述书写规则的XML叫做形式良好的XML文档
<bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
如上图所示:
对于一个xml文件,首先必须要有根元素,该元素是所有其它元素的父元素。
而在xml中所有元素形成了一棵树。父,子及同胞等术语描述了元素之间的关系。
所有的元素都可以拥有子元素。相同层级上的子元素成为同胞。
所有元素都可以拥有文本内容和属性。
Root 根元素
Element 元素
Attribute 属性
Text 文本
在开发中,我们将上述内容也统称为Node(节点)
接下来,我们就分析一下,对于一个xml文档它的主要组成部分有哪些?
1,文档声明
作用:它的作用就是声明当前文件是一个xml文件.
一个文档声明是以<?xml开始 以 ?>结束
它可以存在三个属性.version encoding standalone
version:版本 version="1.0"
encoding:编码 utf-8 gb2312 gbk gb18030 iso8859-1
standalone:不常用 标识当前xml文件是否是一个独立文档.
注意:我们在写xml文件时应该在半角英文状态下书写. 当我们没有使用myeclipse开发工具,在书写xml文件时要注意编码问题?要保证文件编码与文件内容编码一致.
2,元素
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
简单说,元素就是我们所说的标签,
标签必须结束。
3,属性
属性值必须使用引号引起来.
在实际开发中,标签的属性也可以做为子元素存在.
<inpu type='text'/>
可以使用子元素来对属性进行修改
<input>
<type>text1</type>
<type>text2</type>
</input>
为什么要避免使用属性?
因使用属性而引起的一些问题:
属性无法包含多重的值(元素可以)
属性无法描述树结构(元素可以)
属性不易扩展(为未来的变化)
属性难以阅读和维护
4,注释
<!--注释-->这是在xml中的注释,与我们在html中一样.
关于xml文件注释注意:注释不能写在文档声明上面.
5,CDATA区域
这个区域中的信息会按照原样输出,不会被解析器解析.
CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束
如果是一些特殊符号我们也可以使用转义字符 例如< >等
XML约束介绍
XML约束是什么
就是规定xml文件中可以写什么,不可以写什么.
XML约束有哪些
DTD约束
Schema约束
SCHEMA介绍
XML Schema 是基于 XML 的DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
Schema约束文件的后缀是.xsd
SCHEMA约束中它的元素类型分为两种:
1,简单类型 标签中的内容是文本
2,复杂类型 标签具有了属性或标签又有子元素
根据上面的XML内容编写了其对应的约束文件(.xsd)
SCHEMA约束-名称空间
编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束.
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/bookstore2"elementFormDefault="qualified">
targetNamespace元素用于指定schema文档中声明的元素属于哪个名称空间。
elementFormDefault元素用于指定局部元素是否受到该schema定targetNamespace所指定的名称空间限定,如果该值是unqualified,实例xml的根元素必须有命名空间的的限定,这个命名空间必须是schema中定义的targetNameSpace。但是其下子元素无须也不允许用命名空间前缀限定目标命名空间。 子元素的命名空间为空命名空间。如果该值是 qualified,实例xml根元素及其下所有子元素都必须通过命名空间前缀限定目标命名空间。这个命名空间必须是schema中定义的targetNameSpace
名称空间的名字语法容易让人混淆,尽管以 http://开始,那个 URL并不指向一个包含模式定义的文件。事实上,这个 URL:http://www.example.org/bookstore2根本没有指向任何文件,只是一个分配的名字。
在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。 在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。
<bookstore xmlns="http://www.example.org/bookstore2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/bookstore2 bookstore2.xsd">
schemaLocation此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的XML schema的位置,两者之间用空格分隔。
注意,在使用schemaLocation属性时,也需要指定该属性来自哪里。
XSL概览
XSL: extensible stylesheet language 可扩展的样式表语言
XSL 包含 XSLT + FO
FO formatting object
T Transformation 转换
XSL 也是一种标签语言就是一种XML,用来转换XML的例如:XML--》HTML,XML--->XML
XSL------>XSL Html就是xml的一种 说白了还是XML转XML
XSLT 使用 XPath 定位和导航 XML 文档内容,并通过模板对 XML 进行转换
模板定义了 XSLT 的转换规则
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
xpath定位的缺点
xpath 这种定位方式, webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素, 这是个非常费时的操作, 如果脚本中大量使用xpath做元素定位的话, 脚本的执行速度可能会稍慢
作用:用于快读获取到所需的节点对象xPath语法:
"/" 绝对路径表示从xml的根位置开始或者子元素(一个层次结构)
"//"相对路径表示不分任何层次结构的选择元素
"."选择当前元素
".."选择父元素
"*"通配符表示匹配所有的元素
"[ ]"条件表示选择什么条件下的元素
"@"属性表示选择属性节点
"And" 关系表示并且
"|" 关系表示或者
如果路径以斜线/开始,那么该路径就表示到一个元素的绝对路径
/ 就表示从文档的根开始
实例 1
基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径
/AAA |
---|
选择根元素AAA |
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA> |
/AAA/CCC |
---|
选择AAA的所有CCC子元素 |
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA> |
/AAA/DDD/BBB |
---|
选择AAA的子元素DDD的子元素BBB |
<AAA> <BBB/> <CCC/> <BBB/> <BBB/> <DDD> <BBB/> </DDD> <CCC/> </AAA> |
实例 2
如果路径以双斜线 // 开头, 则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)
//BBB |
---|
选择所有BBB元素 |
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB/> <BBB/> </DDD> </CCC> </AAA> |
//DDD/BBB |
---|
选择所有父元素是DDD的BBB元素 |
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB/> <BBB/> </DDD> </CCC> </AAA> |
实例 3
星号 * 表示选择所有由星号之前的路径所定位的元素
/AAA/CCC/DDD/* |
---|
选择所有路径依附于/AAA/CCC/DDD的元素 |
<AAA> <XXX> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </CCC> <CCC> <BBB> <BBB> <BBB/> </BBB> </BBB> </CCC> </AAA> |
/*/*/*/BBB |
---|
选择所有的有3个祖先元素的BBB元素 |
<AAA> <XXX> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </CCC> <CCC> <BBB> <BBB> <BBB/> </BBB> </BBB> </CCC> </AAA> |
//* |
---|
选择所有元素 |
<AAA> <XXX> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </XXX> <CCC> <DDD> <BBB/> <BBB/> <EEE/> <FFF/> </DDD> </CCC> <CCC> <BBB> <BBB> <BBB/> </BBB> </BBB> </CCC> </AAA> |
实例 4
方块号里的表达式可以进一步的指定元素, 其中数字表示元素在选择集里的位置, 而last()函数则表示选择集中的最后一个元素.
/AAA/BBB[1] |
---|
选择AAA的第一个BBB子元素 |
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> </AAA> |
/AAA/BBB[last()] |
---|
选择AAA的最后一个BBB子元素 |
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> </AAA> |
实例 5
属性通过前缀 @ 来指定
//@id |
---|
选择所有的id属性 |
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA> |
//BBB[@id] |
---|
选择有id属性的BBB元素 |
<AAA> <BBBid = "b1"/> <BBBid = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA> |
//BBB[@name] |
---|
选择有name属性的BBB元素 |
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBBname = "bbb"/> <BBB/> </AAA> |
//BBB[@*] |
---|
选择有任意属性的BBB元素 |
<AAA> <BBBid = "b1"/> <BBBid = "b2"/> <BBBname = "bbb"/> <BBB/> </AAA> |
//BBB[not(@*)] |
---|
选择没有属性的BBB元素 |
<AAA> <BBB id = "b1"/> <BBB id = "b2"/> <BBB name = "bbb"/> <BBB/> </AAA> |
实例 6
属性的值可以被用来作为选择的准则, normalize-space函数删除了前部和尾部的空格, 并且把连续的空格串替换为一个单一的空格
//BBB[@id='b1'] |
---|
选择含有属性id且其值为'b1'的BBB元素 |
<AAA> <BBBid = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA> |
//BBB[@name='bbb'] |
---|
选择含有属性name且其值为'bbb'的BBB元素 |
<AAA> <BBB id = "b1"/> <BBB name = " bbb "/> 注意:这个bbb前面有空格 <BBBname = "bbb"/> </AAA> |
//BBB[normalize-space(@name)='bbb'] |
---|
选择含有属性name且其值(在用normalize-space函数去掉前后空格后)为'bbb'的BBB元素 |
<AAA> <BBB id = "b1"/> <BBBname = " bbb "/> <BBBname = "bbb"/> </AAA> |
实例 7
count()函数可以计数所选元素的个数
//*[count(BBB)=2] |
---|
选择含有2个BBB子元素的元素 |
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA> |
//*[count(*)=2] |
---|
选择含有2个子元素的元素 |
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA> |
//*[count(*)=3] |
---|
选择含有3个子元素的元素 |
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA> |
name()函数返回元素的名称, start-with()函数在该函数的第一个参数字符串是以第二个参数字符开始的情况返回true, contains()函数当其第一个字符串参数包含有第二个字符串参数时返回true.
//*[name()='BBB'] |
---|
选择所有名称为BBB的元素(这里等价于//BBB) |
<AAA> <BCC> <BBB/> <BBB/> <BBB/> </BCC> <DDB> <BBB/> <BBB/> </DDB> <BEC> <CCC/> <DBD/> </BEC> </AAA> |
//*[starts-with(name(),'B')] |
---|
选择所有名称以"B"起始的元素 |
<AAA> <BCC> <BBB/> <BBB/> <BBB/> </BCC> <DDB> <BBB/> <BBB/> </DDB> <BEC> <CCC/> <DBD/> </BEC> </AAA> |
//*[contains(name(),'C')] |
---|
选择所有名称包含"C"的元素 |
<AAA> <BCC> <BBB/> <BBB/> <BBB/> </BCC> <DDB> <BBB/> <BBB/> </DDB> <BEC> <CCC/> <DBD/> </BEC> </AAA> |
string-length函数返回字符串的字符数,你应该用<替代<, 用>代替>
//*[string-length(name()) = 3] |
---|
选择名字长度为3的元素 |
<AAA> <Q/> <SSSS/> <BB/> <CCC/> <DDDDDDDD/> <EEEE/> </AAA> |
//*[string-length(name()) < 3] |
---|
选择名字长度小于3的元素 |
<AAA> <Q/> <SSSS/> <BB/> <CCC/> <DDDDDDDD/> <EEEE/> </AAA> |
//*[string-length(name()) > 3] |
---|
选择名字长度大于3的元素 |
<AAA> <Q/> <SSSS/> <BB/> <CCC/> <DDDDDDDD/> <EEEE/> </AAA> |
多个路径可以用分隔符 | 合并在一起
//CCC | //BBB |
---|
选择所有的CCC和BBB元素 |
<AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA> |
/AAA/EEE | //BBB |
---|
选择所有的BBB元素和所有是AAA的子元素的EEE元素 |
<AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA> |
/AAA/EEE | //DDD/CCC | /AAA | //BBB |
---|
可以合并的路径数目没有限制 |
<AAA> <BBB/> <CCC/> <DDD> <CCC/> </DDD> <EEE/> </AAA> |