返回首页
当前位置: 主页 > 航空资料 > 计算机 >

XML高级编程上(103)

时间:2010-08-09 13:05来源:蓝天飞行翻译 作者:admin 点击:
  
一些我们在本章前面讨论的查询需求。
利用X T来测试X S LT和XPa t h查询
随着X S LT和XPa t h的兴起,然而常用的XML 库如M i c r o s o f t和S U N的安装使用都不完全支持
X S LT和XPa t h,这些工作草案只能称为建议性的。M i c r o s o f t已经允诺在下一个M S X M L版本中完
全支持X S LT和XPa t h,预计可以在2 0 0 0年1月份可以出来。到那时, James Clark(X S LT规范的
编者,XPa t h规范的编者之一)会提供出X L S T可安装在J a v a类库或者包的集合,并在Wi n 3 2环境
下可以运行。这些可从下面网址下载:
本章这一部分的所有例子都用X T进行了测试。X T的下载和使用须知可以在附录G中找到。
本章所有例子都是在我们标准的c a t a l o g . x m l文件上操作的:
程序清单8 - 1 0 1
(1) 信息的行方式约束
298使用XML 高级编程
下载
在X M L中,信息的行方式约束等价于基于元素内容的元素约束。如我们所知, XPa t h表达式
就是被用来寻找具有给定值的字段。
因此,如果我们想返回目录中作者为Alex Homer的书籍,我们可以使用下面的格式:
程序清单8 - 1 0 2
注意上面的格式中有两个模板。名字为“ c h i l d n o d e s”的模板被用来递归地写出节点的后代
元素,而这些节点正被写入输出X M L文档—< x s l : c o p y >用来复制当前节点,同样c h i l d n o d e s模
板把遇见的所有子节点复制到文件中。我们会在下面的几个例子中使用这种技术。
用来执行行选择的这部分模板是位于第一个模板中的块< x s l : f o r- e a c h >。这个块仅选择文档
中待输出的那些书—位于方括号内的,和XPa t h表达式相匹配的那些(如我们所知,选择带有
文本Alex Homer的< A u t h o r >元素)。在遇见我们的c a t a l o g . x m l文档时该脚本输出会返回A l e x编著
的三本书:
程序清单8 - 1 0 3
第8章链接和查询使用299 下载
(2) 返回信息的列方式约束
对于X M L来说,通过对文本水平的元素或者由一个样式表的返回属性进行约束可以达到对
返回信息进行列方式约束的目的。假如说我们想从整个书籍清单中提取一些书的标题,而A l e x
H o m e r是这些书的有贡献作者,我们可以使用下面的样式表:
程序清单8 - 1 0 4
这里,我们把另外一个XPa t h表达式作为孩子来从被选书籍中选择标题—仅返回被选书的标
题。很明显,在第二个s e l e c t指令中可以修改XPa t h来改变文本元素—或者列—正在被返回的。
上面的查询返回下面的输出:
程序清单8 - 1 0 5
注意我们在中间增加了空白以使X T的输出更具可读性。
(3) 返回信息概括
X M L信息可利用XPa t h的内置集成函数来进行归纳总结。例如,我们如果想获取部分由A l e x
H o m e r完成的每本书的总页数,可以采用下面的样式表:
300使用XML 高级编程
下载
程序清单8 - 1 0 6
这里我们把使用< x s l : v a l u e - o f >元素中XPa t h表达式选择出的< P a g e s >元素的数量值用sum( )函
数累加起来就可以了。注意我们利用XPa t h表达式按照同样的方式对价格进行操作,因为在目录
中定义< P r i c e >元素时,加了一个前缀$。由于XPa t h提供了一些用于处理字符操作的函数,它不
能对按照S Q L命令相同的方式对集合进行操作,那样会使嵌套操作(例如,去掉前导美元符,
并把结果数值累加起来)变得很困难。
把这个格式页面应用于c a t a l o g . x m l文档之后。我们有:
程序清单8 - 1 0 7
(4) 排序
现在我们把查询延伸一下,来查询是Alex Homer是作者之一的那些书籍。我们也对返回的
书按照标题进行排序(按字母顺序):
程序清单8 - 1 0 8
我们只需把< x s l : s o r t >元素添加到< x s l : f o r- e a c h >元素。它指明了< x s l : f o r- e a c h >元素的S e l e c t属
性返回的节点集按照Ti t l e排序。
第8章链接和查询使用301 下载
这是我们的转换输出:
程序清单8 - 1 0 9
(5) 内部连接
由于X M L文档具有像指针一样的包含方式,将内部连接的概念应用于它们就不太必要了
—如果信息块已经包含在你所具备的那一部分,就没有必要再去查找了。另一方面,如果我
们利用I D和I D R E F属性把元素之间连接起来,我们则需要这个功能。XPa t h允许我们沿着节点树
来将一个文档贯穿起来,允许我们产生一些类似于S Q L内部连接机制提供的选择书-作者对,而
这些书的作者之一为Alex Homer:
程序清单8 - 11 0
这里,我们使用了两个< x s l : f o r- e a c h >块。第一个块处理问题的过滤方面:哪些书是你感兴趣
的?第二个块,沿着节点树向下反复浏览来得到我们感兴趣的东西: < A u t h o r >元素。然后再沿着
节点树向上浏览—去获得我们感兴趣的另一个信息块,也就是书的标题。下面是转换输出:
程序清单8 - 111
302使用XML 高级编程
下载
(6) 外部连接
由于还是由于X M L文档提供了包含功能,外部连接也向关系数据库那样重要—处理器只
需查看一下一元素即可弄清楚信息块存在还是不存在。不过,通过浏览文档树,来提供一些类
似外部连接所提供的功能还是可行的。假如我们提取一列书籍,指明这些书是不是由A l e x
H o m e r完成了一部分。在S Q L中,我们可以使用外部连接,如果一本书Alex Homer并没有写其中
的一部分,则返回N U L L。在X S LT中,我们可以利用count( )函数和< x s l : c h o o s e >分支元素来提
供类似功能:
程序清单8 - 11 2
第8章链接和查询使用303 下载
这里,我们来验证一下Alex Homer是不是每本书的有贡献作者之一(函数c o u n t()行使检
查功能);然后我们根据条件元素< x s l : c h o o s e >代表的路径采用一种方法来创建元素。变换结果
 
中国航空网 www.aero.cn
民航翻译 www.aviation.cn
本文链接地址:XML高级编程上(103)
 
------分隔线----------------------------