XML 声明是处理指令的一种一个XML 文档最好以一个XML 声明作为开始下面
是一个完整的XML 声明
<?xml version = "1.0" encoding = "GB2312" standalone = "no"?>
在一个XML 的处理指令中必须包括version 属性指明所采用的XML 的版本号而
且它必须在属性列表中排在第一位standalone 属性表明该XML 文档是否和一个外部文档
类型定义DTD 配套使用encoding 属性则指明了数据所采用的编码标准如果需要显示中
文那么编码应该是GB2312 或者GBK
2. 元素
元素是XML 文档内容的基本单元从语法上讲一个元素包含一个起始标记一个
结束标记以及标记之间的数据内容其形式是
<元素标记>数据内容</元素标记>
对于标记有以下语法规定
(1) 标记必不可少任何一个格式良好的XML 文档中至少要有一个元素
(2) 大小写有别
(3) 要有正确的结束标记结束标记除了要和起始标记在拼写和大小写上完全相同
还必须在前面加上一个斜杠/ 当一对标记之间没有任何文本内容时可以不写结束标
记而在起始标记的最后冠以斜杠/ 来确认这样的标记称为空标记
(4) 标记要正确嵌套例如<学生><姓名></学生><姓名>就是一个错误的嵌套
(5) 标记命名要合法标记名应该以字母下划线_ 或冒号开头后面跟字
母数字句号. 冒号下划线或连字符- 但是中间不能有空格而且任何标记名
不能以xml 或者xml 大小写的任何组合如XML xML xmL 等等起
始
(6) 有效使用属性标记中可以包含任意多个属性属性以名称/取值对出现属性名
不能重复名称与取值之间用等号= 分隔且取值用引号引起来
3. CDATA 节
在标记CDATA 下所有的标记实体引用都被忽略而被XML 处理程序当作字符数
据看待CDATA 的形式如下
< [CDATA[ 文本内容 ]>
CDATA 的文本内容中不能出现字符串]]> CDATA 不能嵌套
4. 注释
在XML 中注释的方法与HTML 完全相同用< -- 和--> 将注释文本引起来
对于注释还有以下规定
(1) 在注释文本中不能出现字符- 或字符串—
(2) 不要把注释文本放在标记之中类似地不要把注释文本放在实体声明之中或之
前
(3) 注释不能被嵌套例如<学生><!--学习成绩优秀--></学生>就是错误的
5. 处理指示
处理指示是用来给处理XML 文件的应用程序提供信息的所有的处理指示应该遵循
第5 章 XML 简介
下面的格式
< 处理指示名 处理指示信息>
也就是说XML 分析器可能对它并不感兴趣而把这些信息原封不动地传给XML 应
用程序然后这个应用程序来解释这个指示遵照它所提供的信息进行处理或者再把
它原封不动地传给下一个应用程序
实际上前面例子中的XML 声明就是一个处理指示
<?xml version = "1.0" encoding = "GB2312" standalone = "no"?>
6 样式表声明
从本质上讲样式表声明和XML 声明一样这两者都是处理指示的一种但只有需
要对XML 文档进行解析和显示的时候才需要给出这两个处理指示而且XML 的语法规
定XML 文档的第一行必须是XML 声明两者都出现时文档类型声明和样式表声明必须
分别位于第三行和第二行例如下面的XML 文档就是格式良好的具有良构性
程序清单5.3(test.xml)
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="http://fkebjiq.blog.163.com/blog/mystyle.xsl"?>
<学生>
<姓名>许国华</姓名>
</学生>
7. 文档类型声明
为了对XML 文档进行文档类型定义在XML 文档中必须进行文档类型的说明一般
是在XML 风格样式表声明之后如下的XML 文档就是有效的
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="http://fkebjiq.blog.163.com/blog/mystyle.xsl"?>
<!DOCTYPE 根元素名 SYSTEM "mydtd.dtd" >
<学生>
<姓名>方中星</姓名>
</学生>
DTD 有4 种类型的声明即元素类型声明属性列表声明实体声明符号声明
表5.1 正则表达式中的元字符的含义
正则表达式中的元字符 元字符所对应的含义
Space(空格) 不要求严格遵从顺序要求
AND 要求严格遵从顺序要求
+ 出现一次或多次
* 出现零次或多次
可选不出现或出现一次
一组要共同匹配的表达式
| OR 或
元素A 元素B 元素C 元素列表无需遵从顺序要求
表5.2 属性缺省值的意义
属性缺省值 对于缺省值的描述
#required 表示在标记中必须出现此属性
#implied 标记中可以不出现此属性
#fix 属性的值是固定的某个值
字符串 标记中如没有指定属性的值那么此字符串就是此属性的值
在程序清单5.17 中为<视频文件>元素指定了两种可选设备一种是RealPlayer.exe
用来播映.mov 文件另一种则用来显示.gif 图像
程序清单5.17(fuhao.dtd)
<?xml version = "1.0" encoding="GB2312" tandalone = "yes"?>
<!DOCTYPE 文件[
<!ELEMENT 文件 ANY>
<!ELEMENT 视频文件 EMPTY>
<!ATTLIST 视频文件 演示设备 NOTATION ( mp | gif ) #REQUIRED>
<!NOTATION mp SYSTEM "RealPlayer.exe">
<!NOTATION gif SYSTEM "Image/gif">
]>
<文件>
<视频文件 演示设备 = "mp"/>
</文件>
条件段
条件段是文档类型声明外部子集的一部分取决于相应的关键字它们或被包含在
DTD 逻辑结构之内或被排除在DTD 逻辑结构之外同内部或外部DTD 子集一样条件
段可以包含一个或多个完整的声明注释处理指令或嵌套的条件段其间可以夹杂空白
如果条件段的关键字是INCLUDE 那么条件段的内容是DTD 的一部分如果条件段
的关键字是IGNORE 那么条件段的内容逻辑上不是DTD 的一部分如果一个关键字为
INCLUDE 的条件段出现在更大的关键字为IGNORE 的条件段中内外两个条件段都被忽
略如果条件段的关键字是一个参数实体引用处理器在决定是否包含或忽略此条件段前
必须先将该参数实体置换成其内容
CSS 的主要特点和对XML 的贡献如下
实现了所有浏览器和平台之间的兼容性
使页面的字体变得更漂亮而且可以选择各种不同的字体颜色背景等使页
面不再像单纯的XML 包括DTD 文档那样枯燥单调
使得网页中的布局变得轻松而简单并且更合理更清晰
只要这些网页套用的都是一个风格样式表可以将许多网页的风格格式同时更新
不用再一页一页地更新了
更少的编码更少的页数和更快的下载速度
样式表只是简单的文本就像XML 那样它不需要图像不需要执行程序不需
要插件不需要流式它就像XML 指令那样快
定义CSS 的基本格式如下
part{property : value ; property : value ; ...}
part 选择符被施加样式的元素可以是标记tag 类(class) 标识(id)等
property 样式属性可以是颜色字体背景等等
value 样式属性取值决定样式结果
对于每个被施加样式的元素都采用了命令括号 {……} 的格式封闭成为一个独立的
单元样式单一般不包含在XML 文档内部以独立的文档方式存在可以通过如下格式
在XML 文档内部引用CSS 风格样式表
< ? xml-stylesheet type = " text / css " href="http://fkebjiq.blog.163.com/blog/example1.css"?>
其中xml-stylesheet 为关键字type="text /css "表示风格样式表为CSS 类型的
href="http://fkebjiq.blog.163.com/blog/example1.css"表示所引用的风格样式表文件为example1.css 而且该文件与引用它的
XML 文档位于同一目录下如果二者不在同一目录下则必须给出该文件的绝对路径
CSS 风格样式表对文本图片超链接等各种网页元素都可以进行控制下面我们主
要介绍一下对文字和超链接的控制其他元素的控制与此类似读者可以自己类比学习
掌握这部分内容
文字控制
请看下面的简单例子
例
P art1{FONT FAMILY: "宋体"; FONT SIZE: 9pt; LINE HEIGHT: 12pt; color: 000000}
说明FONT FAMILY: "宋体"; 用来指定网页文字的字体FONT SIZE:9pt; 用
来指定网页文字的字号大小pt 是表示大小的单位LINE HEIGHT:12pt; 用来指定行
与行的垂直距离即行高color: 000000 指定网页文字的颜色000000 代表黑色
为十六进制数
链接色彩变化及下划线的控制
例
A:hover {BACKGROUND COLOR: ffccff; COLOR: 0080ff}
说明hover 表示鼠标指示时链接文字背景色为ffccff 前景色为0080ff
例
A:link {color: 000000;TEXT DECORATION: none}
说明link 表示未被访问时链接颜色为黑色链接无下划线
例
A:visited {color:gray;TEXT DECORATION: none}
说明visited 表示被访问后链接颜色为灰色链接无下划线
例
A:active {color:green;text decoration: none}
说明active 表示鼠标点击时链接颜色为绿色链接无下划线
例
A:hover {TEXT DECORATION: underline}
说明hover 表示鼠标指示时链接显示下划线
注释
none——没有下划线
underline——下划线
overline——上划线
line-through——中划线
XSL 语法
前面我们只是给出了一个XSL 的实例下来我们要学习XSL 的书写方法及其规则
要利用XSL 将XML 文档中提取相关数据就要用到XSL 提供的模式化查询语言所谓模
式化查询语言就是通过相关的模式匹配规则表达式从XML 里提取数据的特定语句然
后利用XSL 中的HTML 标记将所选择的网页元素数据包围起来也就是用表现信息
把内容信息包围起来我们也可以说把原始树的元素添加到结果树中
在XSL 中我们可以采用3 种不同的模式来实现上述过程
选择模式< xsl:for-each > < xsl:value-of >
测试模式< xsl:if > <xsl:choose><xsl:otherwise>和< xsl:when >
匹配模式< xsl:template >和<xsl:apply-templates>
选择模式
1 < xsl:for-each >
XSL 提供了这样的具有程序语言性质的语句< xsl:for-each>来选定唯一特定的标记或
者具有相同名称的一系列标记称为结点集而且这种选定可以循环进行直到XML 原始树
的结束它的具体语法如下
< xsl:for-each select="pattern" order-by="sort-criteria-list">
属性说明
select:表示满足select 条件使用此样式描述
order-by:表示对由select 选定的标记的子标记进行排序"sort-criteria-list"是该标记的
子标记列表在列表元素前添加加号+ 表示选定标记的子标记该列表的内容以升序排序
添加减号- 表示逆序排序
当然上述操作只是对XML 的原始树的元素或者说是标记进行了而并没有施加样式
如果要对其施加样式则应该按照如下格式进行
< xsl:for-each select="xml_mark" >
< !--样式定义-- >
< /xsl:for-each >
我们可以看如下一个简单的例子
< xsl:for-each select="东方不败" >
<TR>
<BR><xsl:process-children/></BR>
</TR>
< /xsl:for-each >
参照HTML 标记上述的XSL 语句的含义是不难理解的当然我们也可以采取另外
一种方式
例:
<TR>< xsl:for-each select="东方不败" ><TR>
2. < xsl:value-of >
< xsl:for-each >模式只是选取节点并没有取出节点的值而< xsl:value-of >能够取出
节点的值它的具体语法如下
< xsl:value-of select="pattern" >
属性说明
select:用来与当前上下文匹配的XSL 式样简单地讲如果要在XSL 文档某处插入某
个XML 标记假定是xml_mark 标记的内容可用如下方式表示
< xsl:value-of select="xml_mark" >< /xsl:value-of >
同样我们通过这一语句实现对网页元素标记的风格样式的施加可以采用下列方
式
< xsl:for-each select="东方不败" >
<P>
<TR>
<BR><xsl:value-of select= "风云再起" ></BR>
</TR>
<P>
< /xsl:for-each >
有了简单的选择模式我们已经可以对XML 文档的数据进行简单的格式化输出了
我们可以选取前面的Reference.xml(程序清单5.19)文档作为这种格式化输出的例子在实
现这种输出之前需要对Reference.xml 做少许修改
将其中的第二行
第5 章 XML 简介
<?xml-stylesheet type="text/css" href="http://fkebjiq.blog.163.com/blog/example1.css"?>
改为如下的语句
<?xml-stylesheet type="text/xsl" href="http://fkebjiq.blog.163.com/blog/example1.xsl"?>
然后在同一目录下书写如程序清单5.25 所示的XSL 文件就可以了
程序清单5.25(example1.xsl)
< ?xml version="1.0" encoding="GB2312"? >
< HTML xmlns:xsl="http:www.w3.org/TR/WD-xsl">
< HEAD >
< TITLE >客户信息 < /TITLE >
< /HEAD >
< BODY >
< xsl:for-each select="customer" >
< P/ >
< TABLE border="1" cellspacing="0" >
< CAPTION style="font-size: 150%; font-weight: bold" >
客户信息记录
< /CAPTION >
< TR >
< TH >姓名< /TH >< TD >< xsl:value-of select="name"/ >< /TD >
< TH >姓名< /TH >< TD >< xsl:value-of select="name"/ >< /TD >
< TH >编号< /TH >< TD >< xsl:value-of select="id"/ >< /TD >
< TH >地址< /TH >< TD >< xsl:value-of select="address"/ >< /TD >
< TH >电子邮件< /TH >< TD >< xsl:value-of select="email"/ >< /TD >
< TH >电子邮件< /TH >< TD >< xsl:value-of select="email"/ >< /TD >
< /TR >
< TR >
< TH >订购的货物名称及描述< /TH >< TD colspan="5" >< xsl:value-of select="goodsl"/ >< /TD >
< /TR >
< /TABLE >
< /xsl:for-each >
< xsl:for-each select="customer" >
< P/ >
< TABLE border="1" cellspacing="0" >
< CAPTION style="font-size: 150%; font-weight: bold" >
客户信息记录
< /CAPTION >
< TR >
< TH >姓名< /TH >< TD >< xsl:value-of select="name"/ >< /TD >
< TH >编号< /TH >< TD >< xsl:value-of select="id"/ >< /TD >
< TH >地址< /TH >< TD >< xsl:value-of select="address"/ >< /TD >
< TH >电子邮件< /TH >< TD >< xsl:value-of select="email"/ >< /TD >
< TH >电子邮件< /TH >< TD >< xsl:value-of select="email"/ >< /TD >
< TH >电话< /TH >< TD >< xsl:value-of select="telephone"/ >< /TD >
第二部分 JSP 技术和XML 技术
< /TR >
< TR >
< TH >订购的货物名称及描述< /TH >< TD colspan="5" >< xsl:value-of select="goodsl"/ >< /TD >
< /TR >
< /TABLE >
< /xsl:for-each >
< /BODY >
< /HTML >
测试模式
XML 技术的优势之一就在于数据输出的可选择性即选择需要的数据输出如果我们
对XML 数据不需要全部输出而只需要其中的满足某条件的部分数据那么条件判断
<xsl:if>与多条件判断<xsl:choose>及<xsl:when>则迎合了这种需要这种模式与程序设计中
的流程控制的思想有异曲同工之妙
1. <xsl:if>
XSL 元素<xsl:if>的语法结构如下
<xsl:if expr="script-expression" language="language-name" test="pattern">
属性说明
expr: 脚本语言表达式计算结果为“真”或“假” 如果结果为“真” 且通过test 则在
输出中显示其中内容可省略此项属性
language: expr 属性中表达式的脚本语言类型其取值与HTML 标记SCRIPT. 的
LANGUAGE 属性的取值相同缺省为“JScript” test 源数据测试条件
test : 设定条件的叙述表达式只有当script. 属性的设定值传回“true”时或test 属性
设置的条件成立<xsl:if>中的内容才会被XSL 处理器处理
我们可以看下面一个简单的XSL 片段来加深对这个语句的理解
例:
<xsl:if test=".[@sex='男']">
<td>男<xsl:value-of /></td>
</xsl:if>
该片段的含义是当test 属性设置的条件".[@sex='男']"成立时XSL 语句
<td>男<xsl:value-of /></td>
才会被应用到该测试所在的标记上
2 <xsl:choose> <xsl:when>和<xsl:otherwise>
这3 个元素是用来设定较为复杂的条件式一般共同配合使用
1 < xsl:choose >
语法
< xsl:choose >
属性说明
无属性值表示一个多选测试的开始
第5 章 XML 简介
2 < xsl:when >
语法
< xsl:when expr="script-expression" language="language-name" test="pattern" >
属性说明
expr : 脚本语言表达式计算结果为“真”或“假” 如果结果为“真” 且通过test 则在
输出中显示其中内容可省略此项属性
language : expr 属性中表达式的脚本语言类型其取值与HTML 标记SCRIPT. 的
LANGUAGE 属性的取值相同缺省为“JScript”
test: 源数据测试条件
3 < xsl:otherwise >
语法
< xsl:otherwise >
属性说明
无属性值
在一个多选测试中如果没有不满足< xsl:when >规定的条件如果在最后有此标记
则输出此标记中的内容请看下面简单的XSL 片断
例:
<xsl:choose>
<xsl:when test="mountain">
<td>高山<xsl:value-of /></td>
</xsl:when>
<xsl:when test="valley">
<td>峡谷<xsl:value-of /></td>
</xsl:when>
<xsl:when test="plain">
<td>平原<xsl:value-of /></td>
</xsl:when> <xsl:otherwise>
<td>盆地</td>
</xsl:otherwise>
</xsl:choose>
1 Windows NT 平台的IIS 服务器
<1>启动菜单->程序->WINDOWS NT OPTION PACK ->IIS5.0
<2>右击Internet Information Server 的子项计算机名在快捷菜单上选择属性
<3>在属性页面的下部有一个文件类型F 按钮单击此按钮会出现文件类
型界面
<4>单击新增类型按钮然后在相关的扩展名栏中填写 .wml 在内容类型MIME
栏中填写 text/vnd.wap.wmle 单击确定按钮
2 Apache Web Server
<1>不管是NT 平台 还是UNIX 或LINUX 平台都是修改 Apache 安装目录下的
conf/mime.types 文件
<2>在该文件中增加以下内容
text/vnd.wap.wml .wml image/vnd.wap.wbmp .wbmp
application/vnd.wap.wmlc .wmlc text/vnd.wap.wmls.wmls
application/vnd.wap.wmlsc .wmlsc
<3>存盘
<4>重新启动Apache Web Server 即可