第一章基础知识
1. XML语法规则
1) 声明:<?xmlversion=”1.0” encoding=”UTF-8” standalone=”yes”?>
声明部分本身是可选的,但如果包含声明部分,必须是整个XML文档的第一行内容(第一行不能为注释或者空行)<?xml 必须顶格,且中间不能有空格;
完整的XML声明包含三个部分:
版本声明:version 是必须的,并且作为第一个属性出现;
编码声明:encoding GB2312、UTF-8、UTF-16 可以表示西文和中文;
其他合法属性取值:ISO-10646-UCS-2、ISO-10646-UCS-4、ISO-8859-1
文档独立性声明:
如果有encoding 属性和standalone属性,那么encoding属性必须放
standalone属性前面。
2) 处理指令格式:<?target-name data?>
<?处理指令 用于描述该处理指令的内容?>
例:<?xml-stylesheet href=”style.xsl” type=”text/xsl”?>
当XSL的执行引擎碰到这个处理指令时,就会根据href的取值获得指定的
xsl文件,并对输入的XML文档进行相应的转换。
3) 注释:<!-- -->注释的内容中不能出现连续两个横线
4) 元素:语法格式:
<element_nameatt1=”val1”>内容</element_name>
元素中可以包含文本、子元素、或者两者的组合
元素的名称必须以字母、下划线、冒号开头除首个字符外还可以是数字、
横线(-)点号(.)
元素名称大小写敏感,可以非英文
空元素可以写成<details/>既是开始标记又是结束标记,可以包含属性
5) 属性:
通常以名-值对的形式出现,属性的取值必须加上引号(单或双)
例:<author firstname=”tom”lastname=”hanks”></author>
命名规则同元素
6) 子元素VS属性
对于简单的标量数据(无结构数据)可以采用属性,否则应该采用子元素
可能在数目上发生变化的,应该使用子元素
使用子元素的方案在可扩展方面更好
7) 补充:
一个元素可以包含多个同名的子元素
子元素的顺序是非常重要的
元素在其开始标记中可以包含任意多个属性,但不能包含同名的属性
对于一个元素的属性,不分先后顺序
8) 元素的文本内容:
<在XML语法中具有特殊含义,所以不能在文本内容中出现
可以有 >
例:<lessthan>one<two</lesssthan>错误
特殊字符的预定义实体:
< <
> >
& &
‘ '
“ "
除此之外的其他实体,必须在使用前进行声明
9) CDATA段
<![CDATA[……]]>
里面可以放特殊字符,仅仅代表文本内容,避免歧义
同样CDATA段的文本内容中不能直接出现]]>,并且不能嵌套使用
10) 空白字符:空格、回车、换行、制表
对于连续出现的空白字符,解析器会将其缩减为一个空格字符
如果准备显示标记包含的全部空格,在编辑xml文件时将输入法换成“中文”
输入法,并选择“全角状态”来编辑空格字符。
2. Xml 的全称是eXtensibleMarkup Language
3. Xml相对于html的优点有哪些?
1) 可扩展性:HTML不具备扩展性,而XML时原标记语言,可以用于定
义新的标记语言
2) 侧重点:HTML侧重于如何表现信息,而XML侧重于如何结构化的描述信息
3) 语法要求:HTML不要求标记的嵌套、配对等,而XML严格要求嵌套、配对、遵循DTD树形结构
4) 可读性和维护性:HTML难于阅读和维护,而XML结构清晰,便于阅读维护
5) 数据和显示关系:HTML的内容描述和显示整合唯一,而XML是分离的新的标记语言
4. 如何判断一个xml文档是良构的?
开始标记必须与结束标记相对应
标记是大小写敏感的
标记必须正确的嵌套
属性值必须用引号括起来
有且只有一个根元素
5. 命名空间:默认的命名空间?
<myns:elementxmlns:myns=”http://www.myns.com”></myns:element>
myns:element表示element这个元素属于myns这个命名空间(从属关系)
myns只是命名空间的前缀(别名)
xmlns:myns=”http://www.myns.com是命名空间的声明,表示myns命名空
间的全称为http://www.myns.com
命名空间的作用域由声明该命名空间的元素的开始标记和结束标记界定
声明XML的命名空间:xmlns:prefix-name=”URI”
在同一个命名空间里所有的元素名和属性名必须唯一
缺省命名空间:<companyxmlns=”http://www.myns.com”></company>
6. 实体有哪些作用?
1) 代替无法输入的字符,键盘只有26个字母和一些简单的标点符号,而字
符集中由许多符号是无法在键盘中输入的,这时用实体来代替
2) 代替一些与xml规范保留字相冲突的内容,如:<等
3) 代替大段的重复的文本
第二章 DTD
1. DTD:Document Type Definition 文档类型定义
DTD 是一个面向 SGML 语言的规范,DTD不仅仅用于XML,还可以用它为任何
类型的SGML文档创建模式,包括HTML
语法形式相对简单,容易学习;
2. DTD 局限性:
DTD没有采用 XML 的语法形式
外部的DTD只能一个
不支持 XML 中的命名空间
不能定义复杂数据类型
不能很好实现应用程序不同模块间的相互协调,缺乏对文档结构、属性、数据类型等约束的足够描述能力等等
3. 内部DTD 文件:
<?xml version=”1.0”standalone=”yes”>
<!DOCTYPEstudent[
…
]>
<studnet>
…
</studnet>
其中student为根元素
4. 私有的外部 DTD 文件
<?xml version=”1.0” standalone=”no”>
<!DOCTYPE book SYSTEM “book.dtd”>
<book>
…
</book>
SYSTEM表示私有 book是根元素 “book.dtd”指明位置
no”>
<!DOCTYPE book SYSTEM “book.dtd”>
<book>
…
</book>
SYSTEM表示私有 book是根元素 “book.dtd”指明位置
5. 公开的外部 DTD 文件
<!DOCTYPEroot PUBLIC "DTD_name" "DTD_location">
DTD_name使用下面语法进行描述:
“prefix//owner_of_the_DTD//description_of_the_DTD//
ISO 639_language_indentifier”
prefix:ISO、+或-,分别表示通过批准的ISO标准、通过批准的非ISO标准、
未通过批准的非ISO标准
owner_of_the_DTD:发布该文档的机构
description_of_the_DTD:对文档的简短描述
ISO639_language_indentifier:语言版本
6. DTD 语法:
1) DTD元素属性声明
<!ATTLISTelement-name attr-name attr-type attdesc>
类型 | 描述 |
CDATA | 字符数据“Character data”,可以是任意字符串, 但是不能含有”<“”>””|”单引号,双引号, 如果要用,用实体表示。 |
(value1|value2|..) | 由 value1、value2 等构成的一个枚举类型, 属性值必取其中之一。 |
NMTOKEN | 表示属性的值必须是有效的 XML 名称标记,它指定该属性值是字符串数据,但比CDATA具有更强的约束,它表明属性值只能由字母、数字、下划线_、中划线-、点号(.)和冒号(:) 等组成。 |
NMTOKENS | 由空格隔开的多个 NMTOKEN。 |
ID | 表示属性的值在文档中是唯一的,可以由字母、数字、下划线_、中划线-、点号(.) 组成,但必须与字母或下划线开头 |
IDREF | 表示属性的值引用另一个属性的 ID。 |
IDREFS | 由空格隔开的多个 ID。 |
ENTITY | 表示属性的值是一个实体。 |
ENTITIES | 由空格隔开的多个 ENTITY。 |
NOTATION | 表示属性的值是一个 NOTATION 的名称。 |
2) 属性描述
属性描述 | 含义 |
Value(字符串) | 该属性是必须的,缺省值为 value。 |
#REQUIRED | 该属性是必须的,没有默认值。 |
#IMPLIED | 该属性是可选的,没有默认值。 |
#FIXED value | 该属性是可选的,如果有该属性,值为固定值 value。 |
ID类型属性的默认情况只能是#REQUIRED和#IMPLIED
一个标记的若干属性中,不允许由两个属性的类型都是ID
举例:
<!ATTLIST memo id ID #REQUIRED
security (high|low) “high”
keywords NMTOKENS #IMPLIED>
属性名 属性类型 属性描述
3) 实体的分类和声明
分类:
参数实体 内部参数实体
外部参数实体
一般实体 字符内容实体 命名实体
预定义实体
数值实体
未解析实体
声明:
内部参数实体
格式:
<!ENTITY % entity-name “entity-value”>声明时有空格
<!ELEMENT surname %entity-name;>引用时无空格
外部参数实体
格式:
<!ENTITY %entity-name SYSTEM “URI”>
<!ENTITY %entity-name PUBLIC “public-ID” “URI”>
命名实体
格式:
<!ENTITY entity-name“entity-value”>声明
&entity-name;引用
例:
<?xml version=”1.0” standalone=”yes”?>
<!DOCTYPE author[
<!ELEMENT author (#PCDATA)>
<!ENTITY who “You & me”>
<!ENTITY us “Just &who;”>
]>
<author>&us;</author>
& me”>
<!ENTITY us “Just &who;”>
]>
<author>&us;</author>
4) DTD 元素声明:
<!ELEMENT element-name category>
<!ELEMENT element-name(element-content)>
<!ELEMENT element-name EMPTY>空元素
表明元素的内容为空,不包含子元素或者文本
<!ELEMENT element-name ANY>任意内容
元素中可以包含任意内容
<!ELEMENT element-name (#PCDATA)>只包含文本内容
元素中只包含文本内容不能包含子元素,也可以是空标记
<!ELEMENT element-name (child1,child2,...)>只包含子元素
元素的子元素的顺序不能颠倒,并且每个子元素只出现一次
<!ELEMENT element-name (#PCDATA | child1 | child2 | ...)*>
包含指定的子元素及文本内容
必须将 #PCDATA 放在最前面必须用“*” 号结尾,必须用“|”分隔
只能约束该标记可以有哪些子标记,不能约束这些子标记出现的次数和顺序
约束条件中不能出现限制符号
5) 内容模型中的各种符号:
, 按照顺序
| 任选一项
( ) 作为一个整体
? 出现 0-1次
+ 出现 1 或 多次
* 出现 0 或多次
第三章 Schema
1. XMLSchema 具有特征:
一致性; 完备性; 规范性和准确性;面向对象特征; 扩展性;
元素类型:
简单类型:只包含文本 或者 文本内容为空
复杂类型:包含子元素和/或属性的元素,可以有文本
2. 简单数据类型:
anyType(实际的、可用的数据类型)(包含简单和复杂数据类型)
例:<elementname=”Currency” type=”anyType”>
合法取值:<Currency>USD</Currency>①或
<Currency><dollars>100</dollars></Currency>②
anySimpleType(实际的、可用的数据类型)只能表示标量数据
① 对 ②错
3. 自定义简单数据类型:
限制(restriction)
通过设置最大值或最小值,对数值类型取值的范围进行限制 ;
<xsd:element name=”MyIntegerElement” type=”MyInteger”/>
<!—该元素使用了自定义的简单数据-->
<xsd:simpleType name=”MyInteger”>绿色部分可省
<!—自定义了一个简单数据类型-->
<xsd:restriction base=”xsd:integer”>
<!—为其定义限制-->
<xsd:minInclusive value=”0”/>闭区间 minExclusive开区间
<xsd:maxInclusive value=”100”/>
</xsd:restriction>
</xsd:simpleType>
<!—该元素使用了自定义的简单数据-->
<xsd:simpleType name=”MyInteger”>绿色部分可省
<!—自定义了一个简单数据类型-->
<xsd:restriction base=”xsd:integer”>
<!—为其定义限制-->
<xsd:minInclusive value=”0”/>闭区间 minExclusive开区间
<xsd:maxInclusive value=”100”/>
</xsd:restriction>
</xsd:simpleType>
通过枚举,将取值空间限制为一组合法的取值 ;
<xsd:simpleType>
<xsd:restriction base=”xsd:string”>
<xsd:enumeration value=”A”/>
<xsd:enumeration value=”B”/>
<xsd:enumeration value=”C”/>
</xsd:restriction>
</xsd:simpleType>
base=”xsd:string”>
<xsd:enumeration value=”A”/>
<xsd:enumeration value=”B”/>
<xsd:enumeration value=”C”/>
</xsd:restriction>
</xsd:simpleType>
通过给定一个正则表达式,限制字符串内容的模式 ;
<xsd:simpleType>
<xsd:restriction base=”xsd:string”>
<xsd:pattern value=”[a-z]”/>
</xsd:restriction>
</xsd:simpleType>
base=”xsd:string”>
<xsd:pattern value=”[a-z]”/>
</xsd:restriction>
</xsd:simpleType>
限制文本内容中字符串的长度 ;
<xsd:sinmpleType>
<xsd:restriction base=”xsd:string”/>
<xsd:minLength value=”5”/>确定长度用length
<xsd:maxLength value=”8”/>
</xsd:restriction>
</xsd:simpleType>
base=”xsd:string”/>
<xsd:minLength value=”5”/>确定长度用length
<xsd:maxLength value=”8”/>
</xsd:restriction>
</xsd:simpleType>
限制文本内容中数值的位数和小数位数
<xsd:simpleType>
<xsd:restriction base=”xsd:decimal”>
<xsd:totalDigits value=”4”/>
<xsd:fractionDigits value=”2”/>
</xsd:restriction>
</xsd:simpleType>
base=”xsd:decimal”>
<xsd:totalDigits value=”4”/>
<xsd:fractionDigits value=”2”/>
</xsd:restriction>
</xsd:simpleType>
不允许在进行限制的同时扩大基本数据类型的值空间
列表(List)最小值为100的整数list长度为4
<xsd:simpleType name=”myIntegerList”>
<xsd:list>
<xsd:simpleType>
<xsd:restriction base=”xsd:integer”>
<xsd:minInclusive value=”100”/>
</xsd:restiction>
</xsd:simpleType>
</xsd:list>
</xsd:simpleType>
<xsd:simpleType name=”FourIntegerList”>
<xsd:restriction base=”myIntegerList”>
<xsd:length=”4”/>
</xsd:restriction>
</xsd:simpleType>
<xsd:list>
<xsd:simpleType>
<xsd:restriction base=”xsd:integer”>
<xsd:minInclusive value=”100”/>
</xsd:restiction>
</xsd:simpleType>
</xsd:list>
</xsd:simpleType>
<xsd:simpleType name=”FourIntegerList”>
<xsd:restriction base=”myIntegerList”>
<xsd:length=”4”/>
</xsd:restriction>
</xsd:simpleType>
组合 (Union )整数或者字符串“N/A”
<xsd:simpleType name=”myUnion”>
<xsd:union>
<xsd:simpleType>
<xsd:restriction base=”xsd:integer”/>
</xsd:simpleType>
<xsd:simpleType>
<xsd:restriction base=”xsd:string”>
<xsd:enumeration value=”N/A”/>
</xsd:restriction>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
xsd:union>
<xsd:simpleType>
<xsd:restriction base=”xsd:integer”/>
</xsd:simpleType>
<xsd:simpleType>
<xsd:restriction base=”xsd:string”>
<xsd:enumeration value=”N/A”/>
</xsd:restriction>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
或者
<xsd:simpleType name="integerOrDate">
<xsd:union memberTypes="xsd:integer xsd:date"/>
</xsd:simpleType>
memberTypes="xsd:integer xsd:date"/>
</xsd:simpleType>
4. 自定义复杂数据类型
<xsd:complexType>
1) 只包含属性的空元素
<xsd:complexType name="ComplexType">
<xsd:attribute name="Att1Name" type="someSimpleType1"/>
<xsd:attribute name="Att2Name" type="someSimpleType2"/>
</xsd:complexType>
attribute name="Att1Name" type="someSimpleType1"/>
<xsd:attribute name="Att2Name" type="someSimpleType2"/>
</xsd:complexType>
2) 只包含子元素,不包含文本内容
<xsd:complexType name="studentType">
<xsd:sequence>
<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="student" type="studentType"/>
name="studentType">
<xsd:sequence>
<xsd:element name="firstname" type="xsd:string"/>
<xsd:element name="lastname" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="student" type="studentType"/>
元素的声明必须放在某个容器(xsd:sequence、xsd:choice、xsd:all)中,
即使是只有一个子元素
sequence表示元素必须按照声明的顺序出现
choice表示从所包含的内容中选择其一
all其中所包含的内容不分先后顺序
3) 只包含文本内容和属性,不包含子元素
<xsd:element name="ele_name">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="basetype">或者用restriction
……
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
xsd:simpleContent>
<xsd:extension base="basetype">或者用restriction
……
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
在 xsd:extension 元素中,只能定义与属性有关的内容
可以在 xsd:restriction 元素中使用各种限制方面对其进行限制
4) 同时包含子元素和文本(可能包含属性)
要定义这种复杂数据类型,需要使用 complexType 的 mixed 属性
属性声明出现在子元素之后
<xsd:element name="letter">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="orderid" type="xsd:positiveInteger"/>
<xsd:element name="shipdate" type="xsd:date"/>
</xsd:sequence>
<xsd:attribute name="letter_id" type="xsd:positiveInteger"/>
</xsd:complexType>
</xsd:element>
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="orderid" type="xsd:positiveInteger"/>
<xsd:element name="shipdate" type="xsd:date"/>
</xsd:sequence>
<xsd:attribute name="letter_id" type="xsd:positiveInteger"/>
</xsd:complexType>
</xsd:element>
5) simpleType元素的属性
final 属性的值表示该数据类型不允许进行的操作的列表
#all 表示不能对该类型进行任何操作
6) complexType 元素的属性
abstract 属性表示该复杂类型是一个虚类型,只能用作其他类型的父类型
block 属性(它的取值可能为 #all、extension、restriction)
extension 和 restriction,分别表示禁止使用任何通过扩展/限制而派生
的子类型的实例来代替声明为父类的元素
block=“#all”,仍然可以派生新的子类型
5. Schema中元素和属性的声明
根元素xsd:schema 的直接孩子称为全局的,如果是元素声明,则称之为全局元素;如果是类型声明,则称之为全局类型
元素的声明
先声明一个命名的类型 ele_type,然后通过名称进行引用
直接在元素的声明中包含一个无名的类型声明
6. Schema 中 element 元素的各种属性
1) maxOccurs 和 minOccurs 属性
这两个属性用于限制元素的最大和最小出现次数
<xsd:element name="author" type="xsd:string" minOccurs="1"maxOccurs="3"/>
无数次:maxOccurs="unbounded"
2) default 和 fixed 属性
default 和 fixed 属性用于指定元素缺省值和固定值
只能指定文本内容,所以简单定义才有意义
<xsd:element name="test" type="xsd:string"fixed="fixedstring"/>
3) ref 属性
表示引用某个已经定义的全局元素
<xsd:element ref="person"/>其中person已经被定义过
4) nillable 属性和xsi:nil 属性
nillable=false表示不允许某个元素的值为空,=true允许
<xsd:elementname="studentid" type="xsd:integer"nillable="true"/>
如果某个元素的 xsi:nil属性值为 “true”,则表示该元素的文本内容为空
<studentidxsi:nil="true"></studentid>
5) abstract 属性的取值为 true、false,缺省值为 false。如果 abstract=true,则表示该元素是一个纯虚的头元素
6) block 属性的取值为集合 {extension, restriction, substitution} 的一个子集,用 #all 来表示这个集合的全集
如果 block 属性的取值为 substitution,则表示不允许对该元素进行替换
7) <any>元素 :可能模式中的有些部分无法确定、或者允许用户在某个位
置添加任何所需的内容
<xsd:any/>
第四章 Xpath
1. Xpath函数:
熟练掌握:data()、count() position() node-name() string( ) last()等函数
data(item()*):接受项目序列作为参数,并返回原子值序
(节点文本内容)
count():返回节点的数量
position():返回当前正在被处理的节点的index位置
例:book[position()<=3]返回前三个book元素
string( ):对于文本节点,其字符串值就是该文本节点的内容;
对于属性节点,其字符串值就是该属性的取值。
对于元素节点,其字符串值是将以该节点为根的子树的所有文本
叶节点从左到右串联起来的结果
Node-name()
对于元素节点,node-name() 函数将返回元素的标记;
对于属性节点,该函数将返回属性的名称;
对于处理指令节点,该函数将返回处理指令的名称;
对于命名空间节点,该函数将返回命名空间的前缀。
对于文档节点、注释节点、文本节点,它们是没有名称的,所以
node-name() 函数将返回一个空序列。
缩写形式 | 完整表示形式 |
(无) | 等价于 child:: |
@ | 等价于 attribute:: |
. | 等价于 self::node() |
.//X | 等价于 self::node()/descendant-or-self::node() /child::X |
.. | 等价于 parent::node() |
../X | 等价于 parent::node()/child::X |
// | 等价于 /descendant-or-self::node()/ |
//X | 等价于 /descendant-or-self::node()/child::X |
第五章 XSLT
1. XSLT (eXtensible Stylesheet Language Transformations)
XSLT 语言是一种声明性(Declarative)的语言,非面向对象语言
XSLT 处理程序(或称之为执行引擎)将首先确定XSLT 规则,然后根据规则的匹配条件(通过 XPath 表达式指定)、以及优先顺序完成相应的转换操作
2. 在 XSLT 中,模板的调用分为两种方式
模板必须首先声明(可以指定模板的名称、参数、返回类型等)
然后在合适的地方现实的调用该模板(在遍历文档节点的过程中、或直接调用)
XML文档的根节点与XML文档的文档节点是两个不同的节点
1)根据模板的匹配路径(在遍历的过程中)进行调用
对于模板 xsl:template match="/"(XSLT文档中通常至少包含该模板)
相当于main函数,XSLT处理器在碰到XML文档的文档节点时,将
自动调用该模板
对于其他的模板 match=other-pattern
<xsl:apply-template/>调用当前节点的所有子节点对应的模板
select属性:允许指定调用当前节点的哪些子节点的处理模板
mode属性:指定需要在match属性取值相同的模板中选择哪一个进行调用
2)根据模板名称属性(name),使用 <xsl:call-templatename=”another”/> 直接调用
定义:
<xsl:template name=”doSth”>
<xsl:param name=”paramOne”/>
<xsl:param two=”paramTwo”/>
…模板正文…
使用$paramOne和$paramTwo引用两个模板参数
</xsl:template>
使用:
<xsl:call-template name=”doSth”>
<xsl:with-template name=”paramOne” selelct=”One”/>
<xsl:with-template name=”paramTwo” select=”.”/>
</xsl:call-template>
使用with-template时,必须指定名称,select为其赋值,paramTwo
传递的值为当前节点
模板的属性
name,可有 可无 可用于调用
mode,用于对模板的进一步标识,当调用同一个name的不同模板时使用
priority,不用mode的时候,可以用priority来指明模板的优先级,priority=“2”(模板1)
as,返回类型 例:<xsl:template match=”Name” as=”element()”>
返回一个xml元素,其中可能包括子元素和文本内容,但是不能只返回文本内容或者xml元素组成的序列
3. 了解Copy 和 copy-of的区别
| xsl:copy | xsl:copy-of |
功能 | 将当前节点从源文档复制到结果树 | 复制任何节点集或结果树片段到结果树 |
对当前节点的处理 | 仅复制当前节点,不复制其子元素或者属性 | 复制节点及其所有的子孙节点,包括属性和子元素 |
节点内容 | 可以使用 XSLT 代码为新的节点创建内容,如果当前节点是元素节点或者根节点 | 所有的内容都来自 select 属性中指定的节点集和结果集树片段 |
4. 熟练掌握xsl:value-of、xsl:text、xsl:for-each、xsl:sort的用法
xsl:value-of:提取操作
<xsl:value-ofselect=”expression”>expression中是XPath的表达式
xsl:text:在输出结果中输出包含空白字符的文本内容
xsl:text元素的开始标记和结束标记之间的内容会原封不动的输出到结果 中,但是其中不能包含任何的xml标记
例:
<xsl:template match=”message”>
<xsl:value-of select=”subject”/><xsl:text> </xsl:text>
<xsl:value-of select=”predicate”/><xsl:text> </xsl:text>
<xsl:value-of select=”object”>
</xsl:template>
value-of select=”subject”/><xsl:text> </xsl:text>
<xsl:value-of select=”predicate”/><xsl:text> </xsl:text>
<xsl:value-of select=”object”>
</xsl:template>
xsl:for-each:循环
xsl:for-each的开始标记和结束标记之间,是循环处理的过程体
xsl:sort:排序
<xsl:sort select=expression
data-type={“text”|”number”|QName}
order={“ancending”|descending} case-order={“upper-first”|”lower-first”}>
例:
<xsl:stylesheet version=”2.0” xmlns:xsl=”…”>
<xsl:template match=”/”>
<xsl:apply-templates select=”//Company”/>
</xsl:template>
<xsl:template match=”Company”>
<xsl:for-each select=”Person/Name”>
<xsl:sort select=”.”/>
<li><xsl:value-of select=”.”/></li>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<xsl:template match=”/”>
<xsl:apply-templates select=”//Company”/>
</xsl:template>
<xsl:template match=”Company”>
<xsl:for-each select=”Person/Name”>
<xsl:sort select=”.”/>
<li><xsl:value-of select=”.”/></li>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
5. 如何同时处理多个 XML 源文档
根据从一个XML文档中检索的数据,再去处理另一个XML文档。
在这种情况下,需要使用document()函数打开另一个XML文档。
通过嵌套循环连接的方法来实现两个XML文档之间的等值连接。
6. XSLT的索引机制
XSLT中的索引不是持久化的(并不保存在硬盘中),而是在进行转换的过程中动态生成的(位于内存中),在转换结束之后就会丢弃。
尽管如此,但如果需要连接的而数据非常大,那么动态建立索引要比顺序扫描的效率高得多。
7. 如何建立动态索引
使用xsl:key元素建立索引
然后指定键并使用 key() 函数来查询相应的内容
<xsl:key name=QName match=Patternuse=Expression>
name 指定该索引的名称
match 指定标识持有该键的节点
use 指定要作为该键的值使用的表达式
键值可以是下列任一值:属性、子元素或匹配元素的内容
第六章XQuery
1. 与 XSLT 相比,XQuery 具有以下的特征:
易于使用
更加简洁
强类型语言
更广泛地使用场景
2. FLOWR 表达式是 XQuery 查询计划基本形式 ( 并不是所有xqurere语句都必须包含所有的flower语句)
FOR 子句、 LET 子句、 WHERE 子句、 ORDER BY 子句、 RETURN 子句
1)FOR子句:for $b in doc("bib-demo1.xml")/bib/book
bib表示文件的根元素,book表示要查找的元素节点
2)LET子句:let$i as xs:integer := 100
xs为内置命名空间,表示声明一个整型变量i并给i赋值为100
let 中的普通变量与 for 中的循环变量不同它的取值仅进行一次性地绑定,而不是循环依次绑定
3)WHERE 子句:for$b in doc("bib-demo1.xml")/bib/book
where $b/author/last="Stevens"
return <result> { $b/title }</result>
可以使用 XPath 表达式中的判定谓词来取代 where 语句中的某些判断条件
下面的 where 语句将返回 true:
where(<a/>,<b/>)
where ("true"cast as xs:boolean)
where("false")
where (123)
下面的 where 语句将返回 false:
where ( )
where("false" cast as xs:boolean)
where ("")
where (0)
下面的 where 语句将产生类型错误:
where (123,<a/>)
where ("true"cast as xs:boolean,<a/>)
4)ORDER BY 子句:for $b in doc("bib.xml")/bib/book
order by$b/title
return <result> { $b/title }</result>
对于排序,循环操作(使用 for 语句)是必需的
提供指定结果次序的功能
如果没有order by子句,结果的次序由 for 和let 子句、以及排序模式决定
order by 语句中可以指定排序是 ascending (升序)或 descending(降序),缺省情况为ascending 方式
order by 语句中可以同时指定多个排序标准,首先按照第一标准进行排序,如果出现相等的情况,再依次按照后续的标准进行排序
5)RETURN 子句:很关键
直接构造方法
计算构造方法
元素及其文本内容的直接/计算构造
属性的直接/计算构造
其他内容的直接/计算构造